下面这个专题我想主要总结一些各种不同的排序

来源:互联网 发布:ae软件下载官方中文版 编辑:程序博客网 时间:2024/06/06 02:07

排序这个问题不管是什么语言都可以说是一个永远的问题,不同的排序方法适应的环境和算法的效率有所不同。下面我将逐一介绍常见的几种排序算法,如有什么不对的地方希望大家积极的跟我讨论。

首先介绍一下排序的稳定性:

例:

编号总分1555243434564555按总分排序以后:

编号总分1555455534562434这个排序就是稳定的。

而这个排序就是不稳定的:

编号总分4555155534562434关于排序其它的方面就不多叙述了,直接进入我们今天的主题:

首先是经典的冒泡排序。它的时间复杂度是O(n).

冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

实现代码是:

<pre name="code" class="cpp">void bubblesort(sqlist *l){int i,j;for(i=0;i<l->length;i++){for(j=i+1;j<=l->length;j++){if(l->r[i]>l->r[j]){swap(l,i,j);}}}}


这个算法严格来说不是正宗的冒泡法,但是由他可以得出冒泡法的原型,它最大的缺点就是效率低。

void bubblesort(sqlist *l){int i,j;for(i=0;i<l->length;i++){for(j=l->length-1;j>=i;j--){if(l->r[j]>l->r[j+1]){swap(l,j,j+1);}}}}
通过这两个算法,我们大致可以看出他们之间的差别。

当i=2的时候,变量j由8反向循环到2,逐个比较,在将关键字2交换到第二个位置的同时,也将关键字4和3有所提升,比第一种方式的效率有所提升。

但是这两种方法均有一个缺陷,加入这样一个序列{2,1,3,4,5,6,7,8,9},在交换完第一次之后,序列已经变成有序的,再比较就没有意义,因此大神又想到了解决的方法,看看下面的算法:

void bubblesort(sqlist *l){int i,j;Status flag=true;for(i=0;i<l->length&&flag;i++){flag=false;for(j=l->length-1,j>=i;j--){if(l->r[j]>l->r[j+1]){swap(l,j,j+1);flag=ture;}}}}
这个算法就省去了之前的困难,它增加一个标志,比较8和7,7和6...2和1如果均满足后者比前者大就不需要排序了。






0 0
原创粉丝点击