下面這個專題我想主要總結一些各種不同的排序

排序這個問題不管是什麼語言都可以說是一個永遠的問題,不同的排序方法適應的環境和算法的效率有所不同。下面我將逐一介紹常見的幾種排序算法,如有什麼不對的地方希望大家積極的跟我討論。

首先介紹一下排序的穩定性:

例:

編號 總分
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如果均滿足後者比前者大就不需要排序了。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章