各種排序算法比較

轉載自:http://romyli.iteye.com/blog/761655

一、冒泡排序

  已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較 a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[2]與a[3]的值,若a[2]大於a[3]則交換兩者的值,否則 不變。再比較a[3]與a[4],以此類推,最後比較a[n-1]與a[n]的值。這樣處理一輪後,a[n]的值一定是這組數據中最大的。再對 a[1]~a[n-1]以相同方法處理一輪,則a[n-1]的值一定是a[1]~a[n-1]中最大的。再對a[1]~a[n-2]以相同方法處理一輪, 以此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。

  優點:穩定;

  缺點:慢,每次只能移動相鄰兩個數據。

  二、選擇排序

  冒泡排序的改進版。

  每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最後,直到全部待排序的數據元素排完。

  選擇排序是不穩定的排序方法。

  n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果:

  ①初始狀態:無序區爲R[1..n],有序區爲空。

  ②第1趟排序

  在無序區R[1..n]中選出關鍵字最小的記錄R[k],將它與無序區的第1個記錄R[1]交換,使R[1..1]和R[2..n]分別變爲記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

  ……

  ③第i趟排序

  第i趟排序開始時,當前有序區和無序區分別爲R[1..i-1]和R(1≤i≤n- 1)。該趟排序從當前無序區中選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R分別變爲記錄個數增加1個的新有序區和記錄個數減少1個的新無序區。

  這樣,n個記錄的文件的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。

  優點:移動數據的次數已知(n-1次);

  缺點:比較次數多。

  三、插入排序

  已知一組升序排列數據a[1]、a[2]、……a[n],一組無序數據b[1]、 b[2]、……b[m],需將二者合併成一個升序數列。首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值, 若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a數組中某一數據a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來 a[x]的位置這就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若無數組a,可將b[1]當作n=1的數組a)

  優點:穩定,快;

  缺點:比較次數不一定,比較次數越少,插入點後的數據移動越多,特別是當數據總量龐大的時候,但用鏈表可以解決這個問題。

  三、縮小增量排序

  由希爾在1959年提出,又稱希爾排序(shell排序)。

  已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。發現當n不大 時,插入排序的效果很好。首先取一增量d(d<n),將a[1]、a[1+d]、a[1+2d]……列爲第一組,a[2]、a[2+d]、 a[2+2d]……列爲第二組……,a[d]、a[2d]、a[3d]……列爲最後一組以次類推,在各組內用插入排序,然後取d'<d,重複上述操 作,直到d=1。

  優點:快,數據移動少;

  缺點:不穩定,d的取值是多少,應取多少個不同的值,都無法確切知道,只能憑經驗來取。

  四、快速排序

  快速排序是目前已知的最快的排序方法。

  已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先任取數據 a[x]作爲基準。比較a[x]與其它數據並排序,使a[x]排在數據的第k位,並且使a[1]~a[k-1]中的每一個數 據<a[x],a[k+1]~a[n]中的每一個數據>a[x],然後採用分治的策略分別對a[1]~a[k-1]和a[k+1]~a[n] 兩組數據進行快速排序。

  優點:極快,數據移動少;

  缺點:不穩定。

  五、箱排序

  已知一組無序正整數數據a[1]、a[2]、……a[n],需將其按升序排列。首先定義一個數組x[m],且m>=a[1]、a[2]、……a[n],接着循環n次,每次x[a]++.

  優點:快,效率達到O(1)

  缺點:數據範圍必須爲正整數並且比較小

  六、歸併排序

  歸併排序是多次將兩個或兩個以上的有序表合併成一個新的有序表。最簡單的歸併是直接將兩個有序的子表合併成一個有序的表。

  歸併排序是穩定的排序.即相等的元素的順序不會改變.如輸入記錄 1(1) 3(2) 2(3) 2(4) 5(5) (括號中是記錄的關鍵字)時輸出的 1(1) 2(3) 2(4) 3(2) 5(5) 中的2 和 2 是按輸入的順序.這對要排序數據包含多個信息而要按其中的某一個信息排序,要求其它信息儘量按輸入的順序排列時很重要.這也是它比快速排序優勢的地方.




轉自:http://www.cnblogs.com/stoneJin/archive/2011/10/27/2226770.html

本博文摘自伍迷老師的《大話數據結構》,想學數據結構的,大大的推薦此書...  

事實上,目前還沒有十全十美的排序算法,有優點就會有缺點,即使是快速排序法,也只是在整體性能上優越,它也存在排序不穩定、需要大量輔助空間、對少量數據排序無優勢等不足。因此我們就來從多個角度來剖析一下提到的各種排序的長與短。
  我們將7種算法的各種指標進行對比,如表9‐10‐1所示。

                     表9‐10‐1

排序方法    平均情況      最好情況  最壞情況    輔助空間  穩定性
冒泡排序    O(n2)        O(n)           O(n2)           O(1)          穩定
簡單選擇排序  O(n2)        O(n2)    O(n2)      O(1)    穩定
直接插入排序  O(n2)        O(n)    O(n2)           O(1)          穩定
希爾排序    O(nlogn)-O(n2)   O(n1.3)       O(n2)           O(1)    不穩定
堆排序     O(nlogn)       O(nlogn)      O(nlogn)       O(1)     不穩定
歸併排序    O(nlogn)         O(nlogn)      O(nlogn)       O(n)      穩定
快速排序    O(nlogn)         O(nlogn)      O(n2)         O(logn)~O(n) 不穩定

從算法的簡單性來看,我們將7種算法分爲兩類:

發佈了109 篇原創文章 · 獲贊 12 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章