各种排序算法及程序

来源:互联网 发布:java web网站开发 编辑:程序博客网 时间:2024/06/05 16:12

。。。题主懒了好几天,追剧到凌晨也是心累啊哭。。。

开始正题(由于题主只是刚接触数据结构课的大二狗,写的有欠缺,或者各位有高见请指出,多谢!)

声明:在未特别说明时,假定被排序的数据集合用具有如下类型的结构数组表示。(此声明也适用于接下来的几篇排序算法)

struct records{

keytype key;

fields other;

};

typedef records LIST[maxsize];//假定有n个数组元素,接下来的排序如未有特殊说明都为升序排序

1.气泡排序

一种简单的排序法,第一遍使最小数字浮到最顶部,第二遍使第二小的数浮到第二顺序位置……

算法如下:

void Sort(int n,LIST A){int x,y;for(i=1;i<=n-1;i++){for(j=n;j>=i+1;j++){if(A[j].key<A[j-1].key){Swap(A[j],A[j-1]);}}}}void Swap(records &x,records &y){records temp;temp=x;x=y;y=temp;}
时间复杂度为C(n^2);

2.插入排序

#define -999999999 INF

void Sort(int n,LIST A){int i,j;A[0].key=INF;for(i=1;i<=n;i++){j=i;while(A[j].key<A[j-1].key){Swap(A[j],A[j-1]);j=j-1;}}}
时间复杂性为O(n^2)

3.选择排序

void Sort(int n,LIST A){keytype lowkey;int lowindex;for(i=1;i<=n;i++)//书上给出i<=n,不过感觉i<=n-1即可{lowindex=i;lowkey=A[i].key;for(j=i;j<=n;j++){if(A[j].key<lowkey){lowkey=A[j].key;lowindex=j;}Swap(A[i],A[lowindex]);//第i个位置应该放谁}}}
时间复杂度为O(n^2)

在现实中,如果记录较大,为了减少调整记录位置的时间,可以用一个数组存放记录的指针,交换时只需交换记录指针的相对位置。排序的结果是使记录的指针按记录的关键字不减的顺序。

原创粉丝点击