早教吧作业答案频道 -->其他-->
希尔(shell)排序问题(1)提示用户输入数据(2)希尔排序设计要求:设计算法,首先屏幕上显示上述菜单,用户选择1时,提示用户从键盘随机输入无序元素存入数组中,至少输入10个元素
题目详情
希尔(shell)排序问题
(1)提示用户输入数据
(2)希尔排序
设计要求:设计算法,首先屏幕上显示上述菜单,用户选择1时,提示用户从键盘随机输入无序元素存入数组中,至少输入10个元素。用户选择2时,对数组中的元素进行希尔排序,要求屏幕显示每一趟插入排序结果。并且要求可以多次使用菜单进行选择。
希尔排序又称为缩小增量排序方法,把待排记录按下标的一定增量d分组,对每组记录采用直接插入排序方法进行排序,随着增量d逐渐减小,所分成的组包含的记录越来越多,到增量的值减小到1时,整个数据合为一个排好序的整体。
(1)提示用户输入数据
(2)希尔排序
设计要求:设计算法,首先屏幕上显示上述菜单,用户选择1时,提示用户从键盘随机输入无序元素存入数组中,至少输入10个元素。用户选择2时,对数组中的元素进行希尔排序,要求屏幕显示每一趟插入排序结果。并且要求可以多次使用菜单进行选择。
希尔排序又称为缩小增量排序方法,把待排记录按下标的一定增量d分组,对每组记录采用直接插入排序方法进行排序,随着增量d逐渐减小,所分成的组包含的记录越来越多,到增量的值减小到1时,整个数据合为一个排好序的整体。
▼优质解答
答案和解析
#include
#include
#define maxsize 100
typedef int keytype;
typedef struct{
keytype key;
int other;
}recordtype;
typedef struct{
recordtype r[maxsize+1];
int length;
}table;
void insert(table *tab)
{
int i;
getchar();
printf("请输入这n个正整数:",tab->length);
scanf("%d",&tab->length);
for(i=1;i<=tab->length;i++)
{ printf("请输入第%d个数:",i);
scanf("%d",&tab->r[i] );}
printf("\n");
}
void show(table *tab)
{
int i;
for(i=1;i<=tab->length;i++)
printf("%5d",tab->r[i]);
printf("\n");
}
void shellinsertsort(table *tab)
{
int i,j,d,m=0;
printf("shell插入排序:\n");
d=tab->length/2;
while(d>=1) {
for(i=d+1;i<=tab->length;i++)
{
tab->r[0]=tab->r[i];
j=i-d;
while(tab->r[0].keyr[j].key && j>0)
{
tab->r[j+d]=tab->r[j];
j=j-d;
}
tab->r[j+d]=tab->r[0];
}
d=d/2;
printf("第%d趟:", m++);
show(tab);
}
}
void main()
{
table *tab;
int ch;
tab=(table *)malloc(sizeof(table));
printf(" ***** 菜单 ****** \n");
printf(" *************** 1.提示用户输入数据******************\n");
printf(" *************** 2.shell插入排序 ******************\n");
do{
printf("请输入要操作的数:(1)|(2):");
scanf("%d",&ch);
switch(ch)
{
case 1:insert(tab);break;
case 2:shellinsertsort(tab);break;
default:printf("输入错误,请重新输入!");break;
}}while(1);
}//楼主要加分哈,弄了很久哦
#include
#define maxsize 100
typedef int keytype;
typedef struct{
keytype key;
int other;
}recordtype;
typedef struct{
recordtype r[maxsize+1];
int length;
}table;
void insert(table *tab)
{
int i;
getchar();
printf("请输入这n个正整数:",tab->length);
scanf("%d",&tab->length);
for(i=1;i<=tab->length;i++)
{ printf("请输入第%d个数:",i);
scanf("%d",&tab->r[i] );}
printf("\n");
}
void show(table *tab)
{
int i;
for(i=1;i<=tab->length;i++)
printf("%5d",tab->r[i]);
printf("\n");
}
void shellinsertsort(table *tab)
{
int i,j,d,m=0;
printf("shell插入排序:\n");
d=tab->length/2;
while(d>=1) {
for(i=d+1;i<=tab->length;i++)
{
tab->r[0]=tab->r[i];
j=i-d;
while(tab->r[0].key
{
tab->r[j+d]=tab->r[j];
j=j-d;
}
tab->r[j+d]=tab->r[0];
}
d=d/2;
printf("第%d趟:", m++);
show(tab);
}
}
void main()
{
table *tab;
int ch;
tab=(table *)malloc(sizeof(table));
printf(" ***** 菜单 ****** \n");
printf(" *************** 1.提示用户输入数据******************\n");
printf(" *************** 2.shell插入排序 ******************\n");
do{
printf("请输入要操作的数:(1)|(2):");
scanf("%d",&ch);
switch(ch)
{
case 1:insert(tab);break;
case 2:shellinsertsort(tab);break;
default:printf("输入错误,请重新输入!");break;
}}while(1);
}//楼主要加分哈,弄了很久哦
看了 希尔(shell)排序问题(...的网友还看了以下:
如图所示R=20欧,当滑动变阻器R的滑片P移到a端时电流表示数0.5A,将滑片移到中点电流表示数为 2020-04-08 …
恩格尔系数的食品支出额=什么和什么家庭支出4200食品支出?恩格尔系数0.55 2020-04-08 …
关于热力学温标的示数:273.15K和摄氏温标的示数0℃,两者的大小关系,下列说法正确的是()A. 2020-04-08 …
有理数:1.下列说法错误的是:( )A 所有的有理数均能可以数轴上的点表示.B 数轴上的原点表示数 2020-05-16 …
欧姆定律物理题.一个两只电阻并联的电路图,有两只电流表,电流表A测总电流,A1测R1电阻,已知R1 2020-05-24 …
如图,在数轴上原点o表示数0,A点表示的数是m,B点表示的数是n,且(m-4)的二次方+n+8的绝 2020-06-12 …
合成氨3H2(g)+N2(g)=2NH3(g),原料气摩尔比H2:N2=3:1,673K和1000 2020-07-03 …
某市十年来人均消费支出和恩格尔系数变动情况如下表:2005年2007年2010年2014年人均消费 2020-07-09 …
如图所示电路,电流表A1的示数0.18A,电流表A2的示数为0.58A,通过灯泡L3的电流0.30 2020-07-17 …
某科学兴趣小组用热敏电阻和电压表设计了一只测量范围为0~100℃的水温表图中电压表的示数0~3V,定 2020-12-18 …