1、c语言各种排序举例程序实现:1.冒泡排序的程序实现:/* * * * * * * * * * * * * * * * * * * * * * * */*PROGRAM :起泡排序 */*CONTENT :起泡排序 */* * * * * * * * * * * * * * * * * * * * * * * *#include #include #include #include #include #define MAXSIZE 20 /排序表的最大容量enum BOOLFalse,True;typedef struct /定义排序表的结构int elemwordMAXSIZE; /数据元素关
2、键字int count; /表中当前元素的个数SqList;void InitialSqList(SqList&); /初始化排序表void BubbleSort(SqList &); /起泡排序void PrintSqList(SqList); /显示表中的所有元素void main()SqList L; /声明表Lchar j=y;/-程序说明-printf(本程序将演示起泡排序的操作。n);/-while(j!=n&j!=N)InitialSqList(L); /待排序列初始化BubbleSort(L); /起泡排序PrintSqList(L); /显示排序结果printf(继续进行下一
3、次排序吗?(Y/N);scanf( %c,&j);printf(程序运行结束!n按任意键关闭窗口!n);getchar();getchar();void InitialSqList(SqList &L)/表初始化int i;printf(请输入待排序的记录的个数:);scanf(%d,&L.count);printf(请输入待排序的记录的关键字(整型数):n);for(i=0;i0&change;-i)change=False;for(j=0;jL.elemwordj+1)t=L.elemwordj;L.elemwordj=L.elemwordj+1;L.elemwordj+1=t;chang
4、e=True;void PrintSqList(SqList L)/显示表中所有元素 int i;printf(已排好序的序列如下:n);for(i=0;iL.count;i+)printf(%4d,L.elemwordi);printf(n);*2.选择排序的程序实现:/* * * * * * * * * * * * * * * * * * * * * * * */*PROGRAM :简单选择排序 */*CONTENT :简单选择排序 */* * * * * * * * * * * * * * * * * * * * * * * *#include #include #include #in
5、clude #include #define MAXSIZE 20 /排序表的最大容量typedef struct /定义排序表的结构int elemwordMAXSIZE; /数据元素关键字int count; /表中当前元素的个数SqList;void InitialSqList(SqList&); /初始化排序表void SelectSort(SqList &); /简单选择排序int SelectMinKey(SqList,int); /寻找最小关键字的记录void PrintSqList(SqList); /显示表中的所有元素void main()SqList L; /声明表Lcha
6、r j=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();void InitialSqList(SqList &L)/表初始化int i;printf(请输入待排序的记录的个数:);scanf(%d,&L.count);print
7、f(请输入待排序的记录的关键字(整型数):n);for(i=1;i=L.count;i+)scanf(%d,&L.elemwordi);void SelectSort(SqList &L)/对顺序表L做简单选择排序。int i,j,t;for(i=1;iL.count;+i) /选择第i小的记录,并交换到位 j=SelectMinKey(L,i); /在L.elemwordi.L.count中选择关键字最小的记录if(i!=j) /与第i个记录交换 t=L.elemwordi;L.elemwordi=L.elemwordj;L.elemwordj=t;int SelectMinKey(SqLi
8、st L,int low)/在L.elemwordlow.L.count中寻找关键字最小的记录int i,j,t;t=L.elemwordlow;j=low;for(i=low+1;i=L.count;i+)if(L.elemwordit)t=L.elemwordi;j=i;return j;void PrintSqList(SqList L)/显示表中所有元素int i;printf(已排好序的序列如下:n);for(i=1;i=L.count;i+)printf(%4d,L.elemwordi);printf(n);*3.插入排序的程序实现:/* * * * * * * * * * * *
9、 * * * * * * * * * * * */*PROGRAM :直接插入排序 */*CONTENT :直接插入排序 */* * * * * * * * * * * * * * * * * * * * * * * *#include #include #include #include #include #define MAXSIZE 20 /排序表的最大容量typedef struct /定义排序表的结构int elemwordMAXSIZE; /数据元素关键字int count; /表中当前元素的个数SqList;void InitialSqList(SqList&); /初始化排序表
10、void InsertSort(SqList&); /直接插入排序void PrintSqList(SqList); /显示表中的所有元素void main()SqList L; /声明表Lchar j=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();void InitialS
11、qList(SqList &L)/表初始化int i;printf(请输入待排序的记录的个数:);scanf(%d,&L.count);printf(请输入待排序的记录的关键字(整型数):n);for(i=1;i=L.count;i+) scanf(%d,&L.elemwordi);void InsertSort(SqList &L)int i,j;for(i=2;i=L.count;i+)if(L.elemwordiL.elemwordi-1) /,需将L.elemwordi插入有序子表 L.elemword0=L.elemwordi; /复制为哨兵for(j=i-1;L.elemword0
12、L.elemwordj;-j)L.elemwordj+1=L.elemwordj; /记录后移L.elemwordj+1=L.elemword0; /插入到正确的位置void PrintSqList(SqList L)/显示表所有元素int i;printf(已排好序的序列如下:n);for(i=1;i=L.count;i+) printf(%4d,L.elemwordi);printf(n);4.Shell排序的程序实现:/* * * * * * * * * * * * * * * * * * * * * * * */*PROGRAM :希尔排序 */*CONTENT :希尔排序 */* *
13、 * * * * * * * * * * * * * * * * * * * * * *#include #include #include #include #include #define MAXSIZE 20 /排序表的最大容量typedef struct /定义排序表的结构int elemwordMAXSIZE; /数据元素关键字int count; /表中当前元素的个数SqList;void InitialSqList(SqList&); /初始化排序表void ShellSort(SqList &,int ,int);/希尔排序 void ShellInsert(SqList&,i
14、nt); /一趟希尔排序void PrintSqList(SqList); /显示表中的所有元素void main()SqList L; /声明表Lchar j=y;int dlta3=5,3,1; /希尔排序增量序列,本程序采用5,3,1序列int t=3; /希尔排序增量序列中增量的个数 /-程序说明-printf(本程序将演示希尔排序的操作。n增量序列为5,3,1。n);/-while(j!=n&j!=N)InitialSqList(L); /待排序列初始化ShellSort(L,dlta,t); /希尔排序PrintSqList(L); /显示希尔排序结果printf(继续进行下一次排
15、序吗?(Y/N);scanf( %c,&j);printf(程序运行结束!n按任意键关闭窗口!n);getchar();getchar();void InitialSqList(SqList &L)/表初始化int i;printf(请输入待排序的记录的个数:);scanf(%d,&L.count);printf(请输入待排序的记录的关键字(整型数):n);for(i=1;i=L.count;i+)scanf(%d,&L.elemwordi);void ShellSort(SqList &L,int dlta,int t)/按增量序列dlta0.t-1对顺序表L作希尔排序for(int k=0
16、;kt;+k)ShellInsert(L,dltak); /一趟增量为dltak的插入排序void ShellInsert(SqList &L,int dk)/对顺序表L做一趟希尔插入排序。本算法是和一趟直接插入排序相比,作了以下修改:/1. 前后记录的增量是dk,而不是1/2. 0号单元只是暂存单元,不是哨兵。当j=0时,插入位置已找到int i,j;for(i=dk+1;i=L.count;i+)if(L.elemwordiL.elemwordi-dk) /0&L.elemword0L.elemwordj;j-=dk)L.elemwordj+dk=L.elemwordj; /记录后移,查找
17、插入位置L.elemwordj+dk=L.elemword0; /插入到正确的位置void PrintSqList(SqList L)/显示表所有元素int i;printf(已排好序的序列如下:n);for(i=1;i=L.count;i+) printf(%4d,L.elemwordi);printf(n);5.快速排序的程序实现:/* * * * * * * * * * * * * * * * * * * * * * * */*PROGRAM :快速排序 */*CONTENT :快速排序 */* * * * * * * * * * * * * * * * * * * * * * * *#
18、include #include #include #include #include #define MAXSIZE 20 /排序表的最大容量typedef struct /定义排序表的结构int elemwordMAXSIZE; /数据元素关键字int count; /表中当前元素的个数SqList;void InitialSqList(SqList&); /初始化排序表void QuickSort(SqList &); /快速排序void QSort(SqList &,int,int); /子序列快速排序int Partition(SqList &,int,int); /一趟快速排序vo
19、id PrintSqList(SqList); /显示表中的所有元素void main()SqList L; /声明表Lchar j=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();void InitialSqList(SqList &L
20、)/表初始化int i;printf(请输入待排序的记录的个数:);scanf(%d,&L.count);printf(请输入待排序的记录的关键字(整型数):n);for(i=1;i=L.count;i+)scanf(%d,&L.elemwordi);void QuickSort(SqList &L)/对顺序表L做快速排序。QSort(L,1,L.count);void QSort(SqList &L,int low,int high)/对顺序表中的子序列L.rlow.high作快速排序int pivotloc;if(lowhigh) /长度大于1pivotloc=Partition(L,lo
21、w,high); /将L.elemwordlow.high一分为二QSort(L,low,pivotloc-1); /对低子表递归排序,pivotloc是枢轴位置QSort(L,pivotloc+1,high); /对高子表递归排序int Partition(SqList &L,int low,int high)/交换顺序表L中子表rlow.high的记录,枢轴记录到位,并返回其所在位置,此时/在它之前(后)的记录均不大(小)于它int pivotkey; pivotkey=L.elemwordlow; /用子表的第一个记录作枢轴记录while(lowhigh) /从表的两端交替地向中间扫描
22、while(low=pivotkey)-high;L.elemwordlow=L.elemwordhigh;/将比枢轴记录小的记录移到低端while(lowhigh&L.elemwordlow=pivotkey)+low;L.elemwordhigh=L.elemwordlow; /将比枢轴记录大的记录移到高端L.elemwordlow=pivotkey; /枢轴记录到位return low; /返回枢轴记录void PrintSqList(SqList L)/显示表中所有元素int i;printf(已排好序的序列如下:n);for(i=1;i=L.count;i+)printf(%4d,L
23、.elemwordi);printf(n);*6.堆排序的程序实现 :/* * * * * * * * * * * * * * * * * * * * * * * */*PROGRAM :堆排序 */*CONTENT :堆排序 */* * * * * * * * * * * * * * * * * * * * * * * *#include #include #include #include #include #define MAXSIZE 20 /排序表的最大容量typedef struct /定义排序表的结构int elemwordMAXSIZE; /数据元素关键字int length; /表中当前元素的个数SqList;void InitialSqList(SqList&); /初始化排序表void HeapSort(SqList &); /堆排序void HeapAdjust(SqList &,int,int); /堆调整void PrintSqList(SqList); /显示表中的所有元素void main()SqList L; /声明表Lchar j=y; /-程序说明-printf(本程序将演示堆排序的操作。n);/-while(j!=n&j!=N)InitialSqList(L); /待排序列初始化HeapSort(L); /堆排序Pr
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1