希尔算法,希尔算法分好组后,排序结果是怎么排出来的啊?请高手指点。
你说的这个程序,其实就是要先对这五组分别排序,变为14,59 20,23 17,83 13,36 28,98
然后缩小范围,比如说排序的两个数,下标只相差4,然后再下标只相差3,一直到1;
这是我自己写的一个关于希尔排序的算法。
#include"stdio.h"
#include"stdlib.h"
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
struct Sqlist
{
ElemType *elem;
int length;
int listsize;
};
Status InitList_Sq(Sqlist &L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(1);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return 1;
}
Status ListInsert_Sq(Sqlist &L,int i,ElemType e)
{
ElemType *H,*q,*p;
if(i<1||i>L.length+1)
return 0;
if(L.length>=L.listsize)
{
H=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!H)
exit(1);
L.elem=H;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i]);
p=L.elem+L.length;
for(p;p>=q;p--)
*(p+1)=*p;
*q=e;
++L.length;
return 1;
}
void Shell_Insert(Sqlist &L,int dk)
{
int i,j;
for(i=dk+1;i<=L.length;i++)
if(L.elem[i]<L.elem[i-dk])
{
L.elem[0]=L.elem[i];
for(j=i-dk;j>0 && L.elem[j]>L.elem[0];j=j-dk)
L.elem[j+dk]=L.elem[j];
L.elem[j+dk]=L.elem[0];
}
}
void Shell_Sort(Sqlist &L,int a[],int n)
{
for(int i=0;i<n;i++)
{
Shell_Insert(L,a[i]);
}
}
void Shuchu(Sqlist &L)
{
for(int i=1;i<=L.length;i++)
{
printf("%d\t",L.elem[i]);
}
printf("\n");
}
int main()
{
int a[4]={4,3,2,1};
Sqlist L;
InitList_Sq(L);
ListInsert_Sq(L,1,3);
ListInsert_Sq(L,2,5);
ListInsert_Sq(L,3,56);
ListInsert_Sq(L,4,7);
ListInsert_Sq(L,5,12);
ListInsert_Sq(L,6,35);
ListInsert_Sq(L,7,1);
ListInsert_Sq(L,8,8);
printf("排序前:\n");
Shuchu(L);
printf("排序后:\n");
Shell_Sort(L,a,4);
Shuchu(L);
return 1;
}
其实主要就是那个shell_insert和shell_sort这两个函数。好好的看看吧。
认真的看,还是能看懂的。
然后缩小范围,比如说排序的两个数,下标只相差4,然后再下标只相差3,一直到1;
这是我自己写的一个关于希尔排序的算法。
#include"stdio.h"
#include"stdlib.h"
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
struct Sqlist
{
ElemType *elem;
int length;
int listsize;
};
Status InitList_Sq(Sqlist &L)
{
L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)
exit(1);
L.length=0;
L.listsize=LIST_INIT_SIZE;
return 1;
}
Status ListInsert_Sq(Sqlist &L,int i,ElemType e)
{
ElemType *H,*q,*p;
if(i<1||i>L.length+1)
return 0;
if(L.length>=L.listsize)
{
H=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!H)
exit(1);
L.elem=H;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[i]);
p=L.elem+L.length;
for(p;p>=q;p--)
*(p+1)=*p;
*q=e;
++L.length;
return 1;
}
void Shell_Insert(Sqlist &L,int dk)
{
int i,j;
for(i=dk+1;i<=L.length;i++)
if(L.elem[i]<L.elem[i-dk])
{
L.elem[0]=L.elem[i];
for(j=i-dk;j>0 && L.elem[j]>L.elem[0];j=j-dk)
L.elem[j+dk]=L.elem[j];
L.elem[j+dk]=L.elem[0];
}
}
void Shell_Sort(Sqlist &L,int a[],int n)
{
for(int i=0;i<n;i++)
{
Shell_Insert(L,a[i]);
}
}
void Shuchu(Sqlist &L)
{
for(int i=1;i<=L.length;i++)
{
printf("%d\t",L.elem[i]);
}
printf("\n");
}
int main()
{
int a[4]={4,3,2,1};
Sqlist L;
InitList_Sq(L);
ListInsert_Sq(L,1,3);
ListInsert_Sq(L,2,5);
ListInsert_Sq(L,3,56);
ListInsert_Sq(L,4,7);
ListInsert_Sq(L,5,12);
ListInsert_Sq(L,6,35);
ListInsert_Sq(L,7,1);
ListInsert_Sq(L,8,8);
printf("排序前:\n");
Shuchu(L);
printf("排序后:\n");
Shell_Sort(L,a,4);
Shuchu(L);
return 1;
}
其实主要就是那个shell_insert和shell_sort这两个函数。好好的看看吧。
认真的看,还是能看懂的。
佚名
2024-06-20 06:57:42
类似问题(10)
-
佚名2024-06-20 03:00:58
问请教写主碑高手,风水角度怎么算大黄道,小黄道又怎么算。主要是算中间那几个字的排法,请高手指点
答,对这个我不太清楚。 你可以去这个网上看看,应该会知道你想要的。 http://www.cn-yijing.com/
-
佚名2024-06-20 13:31:35
问魏征辈份排序法
答刘文静,裴寂是跟李渊同朝的官员,是一个辈分,属于文臣系列!在李建成与李世民争皇位中,两人与李渊后宫势力倾向于支持李建成! 李建成、李世民、李元吉分别是李渊的大二...
-
佚名2024-06-20 08:00:00
-
佚名2024-06-20 08:00:00
问高姓家谱中这几辈排序是:继、希、哲,后面是什么?
答哦 那就要看你是高姓那支的了,还有你的祖籍是什么地方了,还有就你是什么地方的了,我就知道高姓辈分有;1有,2成,3云,4两个字名字 )5士6登7( 两个字名字...
-
佚名2024-06-20 08:00:00
问阿尔法狗到底是谁的代表,人类才算是胜利
答这么说也没有错啦,但是现在大家担心的是ai是否从此觉醒呢~
-
佚名2024-06-20 08:00:00
问选举结果报告名单怎样排序
答一般按姓氏笔画排序,也有极少数按得票多少排序的。
-
佚名2024-06-20 08:00:00
问姓名排序 姓氏一样 然后怎么排序
答姓氏一样就按照名字里的字的拼音来排序啊!比如说名字是文文和雨欣,w在y前面,再比如晋贤和晋轩,虽然好像首字拼音是一样的,但是贤里面的i就在轩的u的前面
-
佚名2024-06-20 08:00:00
问法布尔是个怎样的人
答1823年-1915年 让·亨利·卡西米尔·法布尔(Jean-Henri Casimir Fabre ),法国昆虫学家,动物行为学家,文学家。被世人称为“昆虫界...
-
佚名2024-06-20 08:00:00
问EXCEL 姓名排序的问题 高分求解决办法
答Excel默认“曾”的读音是“ceng”,而不是“zeng”,所以会排在前面,解决的办法就是的:把姓氏“曾”查找替换为“增”替换完成后按“姓名”排序排序完成后再...
-
佚名2024-06-20 08:00:00
问门牌号属于排序还是标号 邮政编码呢 第5高楼算计数还是排序?
答门牌号、 邮政编码属于标号, 第5高楼算是排序。
风水
起名
网名
- 1 杉求网名
- 2 带南字的网名 两字
- 3 带或许的网名
- 4 带花女生四字网名
- 5 昵称图片图片大全2015款
- 6 昵称 中英文
- 7 虎牙粉丝昵称颜色
- 8 dnf冒险团昵称确认没反应
- 9 昵称猪猪的句子
- 10 诗词类情侣昵称
说说
- 1 森系女生个性签名大全
- 2 个性签名手机qq不提示
- 3 无法沟通的个性签名
- 4 微信个性签名汉字加拼音
- 5 卑微的爱情签名
- 6 男人爱游戏比女人还重要签名
- 7 准备准备结婚了的说说
- 8 我不是不喜欢你的说说
- 9 两个人在一起不好早点分说说
- 10 热爱生活向往远方的说说