1 插入排序
void
insertsort(int
a, int
n)a[j+1] =key;
}插入排序是穩定的排序,平均和最壞時間複雜度是o(n^2)。最好的時間複雜度是o(n),對應於全部排好序的情況。
2 氣泡排序
void
bubblesort(int
a, intn)}
}氣泡排序是穩定的排序,平均和最壞時間複雜度是o(n^2)。
3 選擇排序
每一趟從待排序的資料元素
中選出最小(或最大)的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。選擇排序
是不穩定的排序方法。
void
selectsort(int
a, intn)}
} 選擇排序是不穩定的,因為,在一趟選擇,如果當前元素比乙個元素小,而該小的元素又出現在乙個和當前元素相等的元素後面,那麼交換後穩定性就被破壞了。舉個例子,序列5 8 5 2 9,我們知道第一遍選擇第1個元素5會和2交換,那麼原序列中2個5的相對前後順序就被破壞了平均和最壞時間複雜度是o(n^2)。
4 希爾排序(縮小增量排序)
該方法的基本思想是:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率上比前兩種方法有較大提高。
void
shellsort(int
a, int
n)a[k+gap] =temp;}}
}}}void
shellsortimproved(int
a, int
n)a[k+gap] =temp;}}
}希爾排序是不穩定的。由於多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,所以shell排序是不穩定的。使用希爾增量時,最壞執行時間是o(n^2),使用hibbard增量時,最壞執行時間是o(n^3/2)。
5. 堆排序
void
maxheapify1(int
a, int
n,int
i) else
return;
}void
maxheapify2(int
a, int
n,int
i)if (largest!=i) else
break;}}
void
heapsort(int
a,int
n)堆排序是原地排序,但是不是穩定排序。時間複雜度o(nlogn)。
6 歸併排序
void
merge(int
a,int
p, int
q, int
r)delete l;
delete r;
}void
mergesort(int
a, int
p,int
r)合併過程中我們可以保證如果兩個當前元素相等時,我們把處在前面的序列的元素儲存在結果序列的前面,這樣就保證了穩定性。所以,歸併排序也是穩定的排序演算法。時間複雜度是o(nlogn)。可以
在空間複雜度
o(1)
的條件下實現歸併排序。
7. 快速排序
被快速排序所使用的空間,依照使用的版本而定。使用原地(in-place)分割槽的快速排序版本,在任何遞迴呼叫前,僅會使用固定的額外空間。然而,如果需要產生o(log n)巢狀遞迴呼叫,它需要在他們每乙個儲存乙個固定數量的資訊。因為最好的情況最多需要o(log n)次的巢狀遞迴呼叫,所以它需要o(log n)的空間。最壞情況下需要o(n)次巢狀遞迴呼叫,因此需要o(n)的空間。
void
median3(int
a,int
p, int
r)int
partition1(int
a, int
p, intr)}
swap(a[i+1],a[r]);
return
i+1;
}int
partition2(int
a, int
p, int
r)swap(a[i],a[r]);
returni;}
void
quicksort(int
a, int
p,int
r) 快速排序是不穩定的排序,最差時間複雜度是o(n^2),平均時間複雜度是o(nlogn)。
8. 桶排序
void
bucketsort(int
a, int
n)int
k = 0;
for (int
i=0; i
<1000; ++i)
}如果count有m個單元,演算法用時o(m+n),桶排序是穩定的排序。但是需要額外的空間。
穩定的排序有:冒泡,插入,歸併,基數,桶。
各種排序演算法總結
注 以下所講排序,以公升序排序為例!選擇排序 作者思路 在一組數中,選擇第乙個數標記為最小值,在剩下的數中找比它小的數,若找到則交換兩數,標記新的 最小值 然後繼續往下找,這樣一趟下來就可以找到一組數中第二小的值,第二次以第二個數作為最小值,如此迴圈下去。這是最簡單 最基礎的一種排序演算法。例子 1...
各種排序演算法總結
created by vencent on 2008.8.29 1.插入排序 1.1 一般插入排序 insertsort int array,int length 1.2 折半插入排序 bininsertsort int array,int length 1.3 希爾排序 shellsort int...
各種排序演算法總結
一 排序分類 內部排序 整個排序過程不需要訪問外存便能完成。外部排序 參加排序的記錄數量很大,整個序列的排序過程不可能在記憶體中完成。二 效能比較 排序方法 平均情況 最好情況 最壞情況 空間穩定性 冒泡o n2 o n o n2 o 1 穩定簡單選擇排序 o n2 o n2 o n2 o 1 不穩...