排序這個問題不管是什麼語言都可以說是一個永遠的問題,不同的排序方法適應的環境和算法的效率有所不同。下面我將逐一介紹常見的幾種排序算法,如有什麼不對的地方希望大家積極的跟我討論。
首先介紹一下排序的穩定性:
例:
編號 | 總分 |
1 | 555 |
2 | 434 |
3 | 456 |
4 | 555 |
編號 | 總分 |
1 | 555 |
4 | 555 |
3 | 456 |
2 | 434 |
而這個排序就是不穩定的:
編號 | 總分 |
4 | 555 |
1 | 555 |
3 | 456 |
2 | 434 |
首先是經典的冒泡排序。它的時間複雜度是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如果均滿足後者比前者大就不需要排序了。