排序算法

来源:互联网 发布:淘宝企业店铺查假货吗 编辑:程序博客网 时间:2024/05/22 00:15

唉。。

HW的实习弄的很烦躁啊。。。过两天有可能要去上海参加企鹅的笔试。。。

效率低下啊。。。

神烦。。。

一个简单的排序算法

for(i=0;i<length;i++){for(j=i+1;j<length;j++){if(r[i]>r[j])swap(r[i],r[j]);}}

这样做每次排序会将最小的值排到最前面,但是效率低。

1.冒泡排序

for(i=0;i<length;i++){for(j=length-1;j>=i;j--){if(r[j]>j[j+1])swap(r[j],r[j+1]);}}

每次排序会将最小的值拍到最前面。

冒泡排序优化:

flag=true;for(i=0;i<length&&flag;i++){flag=false;for(j=length-1;j>=i;j--){if(r[j]>j[j+1])swap(r[j],r[j+1]);flag=true;}}

加入flag进行判定,如果排到一半即有序,就不需要继续进行排序了

时间复杂度:最好O(n),最坏O(n^2),平均O(n^2)。稳定

2.简单选择排序

for(i=0;i<length;i++){min=i;for(j=i+1;j<length;j++){if(r[min]>r[j])min=j;}if(i!=min){swap(r[min],r[i]);}}

一次排序过程中,虽然比较了length-1次,但是只交换了1次。

时间复杂度:O(n^2)。稳定

3.直接插入排序

for(i=2;i<length;i++){if(r[i]<r[i-1]){r[0]=r[i];for(j=i-1;r[j]>r[0];j--){r[j+1]=r[j];}r[j+1]=r[0];}}

时间复杂度:最好O(n),最坏O(n^2),平均O(n^2)。稳定

同样的时间复杂度,但是比冒泡与简单选择性能好

4.快速排序

void improveqsort(int *list, int m, int n){int i,j,k;if(m<n){k=list[m];i=m;j=n+1;while(i<j){for(i=i+1;i<n;i++){if(list[i]>k)break;}for(j=j-1;j>m;j--){if(list[j]<k)break;}if(i<j)swap(list[i],list[j]);}swap(list[j],list[m]);improveqsort(list, m, j-1);improveqsort(list, i, n);}}

时间复杂度:最好O(nlogn) 平均O(nlogn) 最坏O(n^2)  不稳定

最坏情况为序列有序情况,退化为冒泡排序


0 0