c语言各种排序举例.docx
《c语言各种排序举例.docx》由会员分享,可在线阅读,更多相关《c语言各种排序举例.docx(15页珍藏版)》请在冰豆网上搜索。
![c语言各种排序举例.docx](https://file1.bdocx.com/fileroot1/2023-7/2/e112bd8a-5466-4710-915e-48d9092c53bd/e112bd8a-5466-4710-915e-48d9092c53bd1.gif)
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;iscanf("%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;iprintf("%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;kShellInsert(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=pivotkey)
--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