排序算法總結

1.冒泡排序法

void bubble_sort(int data[])
{
	for(int i=n-1;i>=0;--i)
	{
		int flag=0;
		for(int j=0;j<i;++j)
		{
			if(data[j+1]<data[j])
			{
				int tmp;
				tmp=data[j];
				data[j]=data[j+1];
				data[j+1]=tmp;
				flag++;
			}
			if(flag==0)
				break;
		}
	}
}

分析:

冒泡排序法最壞情況及平均情況均需要比較(n-1)+(n-2)+...+3+2+1=n*(n-1)/2次,時間複雜度爲O(n^2),最好的情況只需要掃描一次,發現沒有交換的動作則表示已經排序完成,所以只做了n-1次比較,時間複雜度爲O(n).

由於冒泡排序爲相鄰兩者相互比較並對調,不會影響其他元素的順序,所以是穩定排序法

只需要一個額外的空間,適用於數據量小或者有部分數據已經排過序的數組

2.選擇排序法

void select_sort(int data[])
{
	for(int i=0;i<n-1;++i)
	{
		for(int j=i+1;j<n;++j)
		{
			if(data[i]>data[j])
			{
				swap(data[i],data[j]);
			}
		}
	}
}

分析:

無論是最壞情況、最好情況還是平均情況都需要找到最大值(或最小值),所以比較次數爲(n-1)+(n-2)+...+3+2+1=n*(n-1)/2,時間複雜度爲O(n^2)。

由於選擇排序是以最大值或最小值直接與最前方未排序的鍵值交換,數據排列順序有可能被改變,不是穩定排序法

只需要一個額外空間,適用於數據量小或有部分數據已經排過序的數組

3.插入排序法

void insert_sort(int data[])
{
	int i;
	int j;
	for(i=1;i<n;++i)
	{
		int tmp;
		tmp=data[i];
		j=i-1;
		while(j>=0&&tmp<data[j])
		{
			data[j+1]=data[j];
			j--
		}
		data[j+1]=tmp;
	}
}

分析:

最壞及平均情況都需要比較(n-1)+(n-2)+...+3+2+1=n*(n-1)/2次,

是穩定排序法,只需要一個額外空間,適用於大部分數據已經排過序或已排序數組新增數據後進行排序

會造成大量數據移動,建議在鏈表結構使用

4.桶排序法(基數排序法)

不需要進行元素間的比較操作,屬於分配排序方式,包括最高位優先、最低位優先(按照個位數、十位數、百位數。。的順序進行排序)

分析:

在所有情況下,時間複雜度均爲O(nlogp(k)),k爲原始數據的最大值,p是數據位數

桶排序法(基數排序法)是穩定排序法

基數排序法會使用到很大的額外空間來存放序列數據,其空間複雜度爲O(n*p),其中n是原始數據的個數,p是數據位數

若n很大,p固定或很小時,效率較高

5.希爾排序法

類似於插入排序法,但可以減少數據移動的次數,排序的原則是將數據劃分成特定間隔的幾個子集,以插入排序法排完子集內的數據後再逐漸減少間隔的距離。

分析:

任何情況下的時間複雜度均爲O(n^(3/2))

希爾排序法和插入排序法一樣都是穩定排序法

只需要一個額外空間,空間複雜度最佳

適用於數據大部分已經排序完成的情況

6.快速排序法

7.堆排序法

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