几种排序算法的代码实现Word格式文档下载.docx
《几种排序算法的代码实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《几种排序算法的代码实现Word格式文档下载.docx(4页珍藏版)》请在冰豆网上搜索。
intoutputList(PSqListp);
intshell_insert(PSqListp,int(*comp)(void*,void*),constintd);
intshellSort(PSqListp,int(*comp)(void*,void*),constintdistance,constintt);
#endif /*这是shell_文件的内容*/ //这是希尔排序,前面的所有排序都是逐个的将下一个元素插入前面已经排序了的列表中,这就比避免不了 //排序中一些较“大”的数据,开始时却在前面的数据会被进行大量的比较或移动。
这是随机数据的主要 //耗时的地方。
希尔排序将数据分成d组,每组的每两个相邻数据的下标之差是d。
然后对每组数据进行各自的 //排序。
因为每组数据的增量是d,所以数据的移动是每次d个位置。
如果d取得合适,这样可以很快的将每个 //数据移动到距离自己最终位置较靠近的地方。
然后将d逐渐减 小,继续排序。
//最后当d的值为1排序结束之后,全部的数据就排序好了。
#include#include\ intcomp(void*d1,void*d2){//比较函数 return(((PRedType)d1)->
data-((PRedType)d2)->
data);
} intinputList(PSqListp,intlength){//输入序列 if(p==NULL) returnP_NULL;
//1,指针是空的 if(length>
MAXSIZE) returnTOOBIG;
//2,要输入的序列太多 inti=0;
for(i=0;
i if(scanf(K_T,&
(p->
list[i].data))!
=1) returnNUM_ERROR;
//3,输入的数字有误 p->
length=length;
returnOK;
//0} intoutputList(PSqListp){//输出序列 if(p==NULL) returnP_NULL;
inti=0;
for(i=0;
ilength;
i++) printf(K_T\ putchar(‘\\n’);
}//outputList intshell_insert(PSqListp,int(*comp)(void*,void*),constintd){//以d为增量的一次排序 RedTypetmp;
inti=0;
intj;
for(i=d;
ilength;
i++) { tmp=p->
list[i];
j=i-d;
while(j>
=i%d&
&
comp(&
tmp,&
list[j])) p->
list[j+d]=p->
list[j];
j-=d;
} p->
list[j+d]=tmp;
} returnOK;
}//shell_insert intshellSort(PSqListp,int(*comp)(void*,void*),constintdistance,constintt){//希尔排序,distance数组用来给出每次排序的增量,最后一个必须为1 inti=0;
i shell_insert(p,comp,distance[i]);
returnOK;
}//shellSort /*这是文件的内容*/#include#include#include#include\ intmain(intargc,char*argv){ intstatus;
PSqListtest;
test=(PSqList)malloc(sizeof(SqList));
intn=0;
printf(\请输入第一组待排序的数的个数(输入0结束循环):
\ while
(1) { while(scanf(\ { puts(\输入有误!
请重新输入!
\ while(getchar()!
=‘\\n’);
} if(n==0) //结束 break;
if(status=inputList(test,n)!
=0) { puts(\输入的数字有误!
\ while(getchar()!
//exit(status);
} intdistance[3];
//distance一些特定的增量算法确定 for(inti=0;
i distance[i]=(int)pow(2,3-i)-1;
shellSort(test,comp,distance,3);
outputList(test);
printf(\请输入下一组待排序的数的个数(输入0结束循环):
\ } free(test);
return0;
} //快速排序 /*这是quick_文件*/#ifndefquick_sort #definequick_sort #defineMAXSIZE100typedefintKeyType;
#defineK_T\ //用于输入输出如printf(K_T,p->
intquickSort(PSqListp,int(*comp)(void*,void*));
#endif /*这是quick_文件*/#include\#include intinputList(PSqListp,intlength){//输入序列 if(p==NULL) returnP_NULL;
i++) printf(K_T\
putchar(‘\\n’);
}//outputList staticintpartition(PSqListp,int(*comp)(void*,void*),intlow,inthigh) {//交换顺序表[low...high]记录,枢轴记录到位,并返回其值,此时在它之前的记录不大于它,在它之后的记录不小于它 RedTypetmp=p->
list[low];
//用于存储中轴 while(low while(lowlist[high]),&
(tmp))>
=0) high--;
p->
list[low]=p->
list[high];
while(lowlist[low]),&
(tmp)) p->
list[high]=p->
} p->
list[low]=tmp;
returnlow;
}//partition staticintQSort(PSqListp,int(*comp)(void*,void*),intlow,inthigh){//对顺序表p的子序列list[low,high]进行排序 if(low>
=high) return0;
intpivotloc=0;
pivotloc=partition(p,comp,low,high);
QSort(p,comp,low,pivotloc-1);
QSort(p,comp,pivotloc+1,high);
}//QSort intquickSort(PSqListp,int(*comp)(void*,void*)){//对表p进行快速排序 QSort(p,comp,0,p->
length-1);
}//quickSort /*这是文件*/#include#include#include\ intcomp(void*d1,void*d2);
intmain(intargc,char*argv){ intstatus;
\