QQ网名大全

希尔算法,希尔算法分好组后,排序结果是怎么排出来的啊?请高手指点。

你说的这个程序,其实就是要先对这五组分别排序,变为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这两个函数。好好的看看吧。
认真的看,还是能看懂的。
佚名
2024-06-20 06:57:42
最佳回答
类似问题(10)