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.堆排序法