c语言各种排序举例.docx

上传人:b****3 文档编号:27541592 上传时间:2023-07-02 格式:DOCX 页数:15 大小:17.80KB
下载 相关 举报
c语言各种排序举例.docx_第1页
第1页 / 共15页
c语言各种排序举例.docx_第2页
第2页 / 共15页
c语言各种排序举例.docx_第3页
第3页 / 共15页
c语言各种排序举例.docx_第4页
第4页 / 共15页
c语言各种排序举例.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

c语言各种排序举例.docx

《c语言各种排序举例.docx》由会员分享,可在线阅读,更多相关《c语言各种排序举例.docx(15页珍藏版)》请在冰豆网上搜索。

c语言各种排序举例.docx

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=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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1