c语言各种排序举例.docx
- 文档编号:15223744
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:15
- 大小:17.80KB
c语言各种排序举例.docx
《c语言各种排序举例.docx》由会员分享,可在线阅读,更多相关《c语言各种排序举例.docx(15页珍藏版)》请在冰点文库上搜索。
c语言各种排序举例
程序实现:
1.冒泡排序的程序实现:
//************************
//*PROGRAM:
起泡排序*
//*CONTENT:
起泡排序*
//************************
#include
#include
#include
#include
#include
#defineMAXSIZE20//排序表的最大容量
enumBOOL{False,True};
typedefstruct//定义排序表的结构
{intelemword[MAXSIZE];//数据元素关键字
intcount;//表中当前元素的个数
}SqList;
voidInitialSqList(SqList&);//初始化排序表
voidBubbleSort(SqList&);//起泡排序
voidPrintSqList(SqList);//显示表中的所有元素
voidmain()
{SqListL;//声明表L
charj='y';
//-------------------------程序说明-------------------------------
printf("本程序将演示起泡排序的操作。
\n");
//----------------------------------------------------------------
while(j!
='n'&&j!
='N')
{InitialSqList(L);//待排序列初始化
BubbleSort(L);//起泡排序
PrintSqList(L);//显示排序结果
printf("继续进行下一次排序吗?
(Y/N)");
scanf("%c",&j);
}
printf("程序运行结束!
\n按任意键关闭窗口!
\n");
getchar();getchar();
}
voidInitialSqList(SqList&L)
{//表初始化
inti;
printf("请输入待排序的记录的个数:
");
scanf("%d",&L.count);
printf("请输入待排序的记录的关键字(整型数):
\n");
for(i=0;i scanf("%d",&L.elemword[i]); } voidBubbleSort(SqList&L) {//对顺序表L做起泡排序。 inti,j,t; BOOLchange; for(i=L.count-1,change=True;i>0&&change;--i) {change=False; for(j=0;j if(L.elemword[j]>L.elemword[j+1]) {t=L.elemword[j]; L.elemword[j]=L.elemword[j+1]; L.elemword[j+1]=t; change=True; } } } voidPrintSqList(SqListL) {//显示表中所有元素 inti; printf("已排好序的序列如下: \n"); for(i=0;i printf("%4d",L.elemword[i]); printf("\n"); } ******************************************************************************* 2.选择排序的程序实现: //************************ //*PROGRAM: 简单选择排序* //*CONTENT: 简单选择排序* //************************ #include #include #include #include #include #defineMAXSIZE20//排序表的最大容量 typedefstruct//定义排序表的结构 {intelemword[MAXSIZE];//数据元素关键字 intcount;//表中当前元素的个数 }SqList; voidInitialSqList(SqList&);//初始化排序表 voidSelectSort(SqList&);//简单选择排序 intSelectMinKey(SqList,int);//寻找最小关键字的记录 voidPrintSqList(SqList);//显示表中的所有元素 voidmain() {SqListL;//声明表L charj='y'; //-------------------------程序说明------------------------------- printf("本程序将演示简单选择排序的操作。 \n"); //---------------------------------------------------------------- while(j! ='n'&&j! ='N') {InitialSqList(L);//待排序列初始化 SelectSort(L);//简单选择排序 PrintSqList(L);//显示排序结果 printf("继续进行下一次排序吗? (Y/N)"); scanf("%c",&j); } printf("程序运行结束! \n按任意键关闭窗口! \n"); getchar();getchar(); } voidInitialSqList(SqList&L) {//表初始化 inti; printf("请输入待排序的记录的个数: "); scanf("%d",&L.count); printf("请输入待排序的记录的关键字(整型数): \n"); for(i=1;i<=L.count;i++) scanf("%d",&L.elemword[i]); } voidSelectSort(SqList&L) {//对顺序表L做简单选择排序。 inti,j,t; for(i=1;i {j=SelectMinKey(L,i);//在L.elemword[i..L.count]中选择关键字最小的记录 if(i! =j)//与第i个记录交换 {t=L.elemword[i]; L.elemword[i]=L.elemword[j]; L.elemword[j]=t; } } } intSelectMinKey(SqListL,intlow) {//在L.elemword[low..L.count]中寻找关键字最小的记录 inti,j,t; t=L.elemword[low]; j=low; for(i=low+1;i<=L.count;i++) if(L.elemword[i] {t=L.elemword[i]; j=i; } returnj; } voidPrintSqList(SqListL) {//显示表中所有元素 inti; printf("已排好序的序列如下: \n"); for(i=1;i<=L.count;i++) printf("%4d",L.elemword[i]); printf("\n"); } *************************************************** 3.插入排序的程序实现: //************************ //*PROGRAM: 直接插入排序* //*CONTENT: 直接插入排序* //************************ #include #include #include #include #include #defineMAXSIZE20//排序表的最大容量 typedefstruct//定义排序表的结构 {intelemword[MAXSIZE];//数据元素关键字 intcount;//表中当前元素的个数 }SqList; voidInitialSqList(SqList&);//初始化排序表 voidInsertSort(SqList&);//直接插入排序 voidPrintSqList(SqList);//显示表中的所有元素 voidmain() {SqListL;//声明表L charj='y'; //-------------------------程序说明------------------------------- printf("本程序将演示直接插入排序的操作。 \n"); //---------------------------------------------------------------- while(j! ='n'&&j! ='N') {InitialSqList(L); InsertSort(L); PrintSqList(L); printf("继续进行下一次排序吗? (Y/N)"); scanf("%c",&j); } printf("程序运行结束! \n按任意键关闭窗口! \n"); getchar();getchar(); } voidInitialSqList(SqList&L) {//表初始化 inti; printf("请输入待排序的记录的个数: "); scanf("%d",&L.count); printf("请输入待排序的记录的关键字(整型数): \n"); for(i=1;i<=L.count;i++) scanf("%d",&L.elemword[i]); } voidInsertSort(SqList&L) {inti,j; for(i=2;i<=L.count;i++) if(L.elemword[i] {L.elemword[0]=L.elemword[i];//复制为哨兵 for(j=i-1;L.elemword[0] L.elemword[j+1]=L.elemword[j];//记录后移 L.elemword[j+1]=L.elemword[0];//插入到正确的位置 } } voidPrintSqList(SqListL) {//显示表所有元素 inti; printf("已排好序的序列如下: \n"); for(i=1;i<=L.count;i++) printf("%4d",L.elemword[i]); printf("\n"); } 4.Shell排序的程序实现: //************************ //*PROGRAM: 希尔排序* //*CONTENT: 希尔排序* //************************ #include #include #include #include #include #defineMAXSIZE20//排序表的最大容量 typedefstruct//定义排序表的结构 {intelemword[MAXSIZE];//数据元素关键字 intcount;//表中当前元素的个数 }SqList; voidInitialSqList(SqList&);//初始化排序表 voidShellSort(SqList&,int[],int);//希尔排序 voidShellInsert(SqList&,int);//一趟希尔排序 voidPrintSqList(SqList);//显示表中的所有元素 voidmain() {SqListL;//声明表L charj='y'; intdlta[3]={5,3,1};//希尔排序增量序列,本程序采用5,3,1序列 intt=3;//希尔排序增量序列中增量的个数 //-------------------------程序说明------------------------------- printf("本程序将演示希尔排序的操作。 \n增量序列为5,3,1。 \n"); //---------------------------------------------------------------- while(j! ='n'&&j! ='N') {InitialSqList(L);//待排序列初始化 ShellSort(L,dlta,t);//希尔排序 PrintSqList(L);//显示希尔排序结果 printf("继续进行下一次排序吗? (Y/N)"); scanf("%c",&j); } printf("程序运行结束! \n按任意键关闭窗口! \n"); getchar();getchar(); } voidInitialSqList(SqList&L) {//表初始化 inti; printf("请输入待排序的记录的个数: "); scanf("%d",&L.count); printf("请输入待排序的记录的关键字(整型数): \n"); for(i=1;i<=L.count;i++) scanf("%d",&L.elemword[i]); } voidShellSort(SqList&L,intdlta[],intt) {//按增量序列dlta[0..t-1]对顺序表L作希尔排序 for(intk=0;k ShellInsert(L,dlta[k]);//一趟增量为dlta[k]的插入排序 } voidShellInsert(SqList&L,intdk) {//对顺序表L做一趟希尔插入排序。 本算法是和一趟直接插入排序相比,作了以下修改: //1.前后记录的增量是dk,而不是1 //2.0号单元只是暂存单元,不是哨兵。 当j<=0时,插入位置已找到 inti,j; for(i=dk+1;i<=L.count;i++) if(L.elemword[i] {L.elemword[0]=L.elemword[i];//暂存在0号单元 for(j=i-dk;j>0&&L.elemword[0] L.elemword[j+dk]=L.elemword[j];//记录后移,查找插入位置 L.elemword[j+dk]=L.elemword[0];//插入到正确的位置 } } voidPrintSqList(SqListL) {//显示表所有元素 inti; printf("已排好序的序列如下: \n"); for(i=1;i<=L.count;i++) printf("%4d",L.elemword[i]); printf("\n"); } 5.快速排序的程序实现: //************************ //*PROGRAM: 快速排序* //*CONTENT: 快速排序* //************************ #include #include #include #include #include #defineMAXSIZE20//排序表的最大容量 typedefstruct//定义排序表的结构 {intelemword[MAXSIZE];//数据元素关键字 intcount;//表中当前元素的个数 }SqList; voidInitialSqList(SqList&);//初始化排序表 voidQuickSort(SqList&);//快速排序 voidQSort(SqList&,int,int);//子序列快速排序 intPartition(SqList&,int,int);//一趟快速排序 voidPrintSqList(SqList);//显示表中的所有元素 voidmain() {SqListL;//声明表L charj='y'; //-------------------------程序说明------------------------------- printf("本程序将演示快速排序的操作。 \n"); //---------------------------------------------------------------- while(j! ='n'&&j! ='N') {InitialSqList(L);//待排序列初始化 QuickSort(L);//快速排序 PrintSqList(L);//显示排序结果 printf("继续进行下一次排序吗? (Y/N)"); scanf("%c",&j); } printf("程序运行结束! \n按任意键关闭窗口! \n"); getchar();getchar(); } voidInitialSqList(SqList&L) {//表初始化 inti; printf("请输入待排序的记录的个数: "); scanf("%d",&L.count); printf("请输入待排序的记录的关键字(整型数): \n"); for(i=1;i<=L.count;i++) scanf("%d",&L.elemword[i]); } voidQuickSort(SqList&L) {//对顺序表L做快速排序。 QSort(L,1,L.count); } voidQSort(SqList&L,intlow,inthigh) {//对顺序表中的子序列L.r[low..high]作快速排序 intpivotloc; if(low {pivotloc=Partition(L,low,high);//将L.elemword[low..high]一分为二 QSort(L,low,pivotloc-1);//对低子表递归排序,pivotloc是枢轴位置 QSort(L,pivotloc+1,high);//对高子表递归排序 } } intPartition(SqList&L,intlow,inthigh) {//交换顺序表L中子表r[low..high]的记录,枢轴记录到位,并返回其所在位置,此时 //在它之前(后)的记录均不大(小)于它 intpivotkey; pivotkey=L.elemword[low];//用子表的第一个记录作枢轴记录 while(low {while(low --high; L.elemword[low]=L.elemword[high];//将比枢轴记录小的记录移到低端 while(low ++low; L.elemword[high]=L.elemword[low];//将比枢轴记录大的记录移到高端 } L.elemword[low]=pivotkey;//枢轴记录到位 returnlow;//返回枢轴记录 } voidPrintSqList(SqListL) {//显示表中所有元素 inti; printf("已排好序的序列如下: \n"); for(i=1;i<=L.count;i++) printf("%4d",L.elemword[i]); printf("\n"); } *************************************************************************** 6.堆排序的程序实现: //************************ //*PROGRAM: 堆排序* //*CONTENT: 堆排序* //************************ #include #include #include #include #include #defineMAXSIZE20//排序表的最大容量 typedefstruct//定义排序表的结构 {intelemword[MAXSIZE];//数据元素关键字 intlength;//表中当前元素的个数 }SqList; voidInitialSqList(SqList&);//初始化排序表 voidHeapSort(SqList&);//堆排序 voidHeapAdjust(SqList&,int,int);//堆调整 voidPrintSqList(SqList);//显示表中的所有元素 voidmain() {SqListL;//声明表L charj='y'; //-------------------------程序说明------------------------------- printf("本程序将演示堆排序的操作。 \n"); //---------------------------------------------------------------- while(j! ='n'&&j! ='N') {InitialSqList(L);//待排序列初始化 HeapSort(L);//堆排序 Pr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 各种 排序 举例