各種排序演算法的比較

2021-06-19 17:59:36 字數 2193 閱讀 9670

穩定的排序演算法有:直接插入,冒泡,歸併,基數排序。

一.快速排序

快排的三個步驟:

1.選取樞紐元,一般用三數中值法,即求得left,center,right的中位數(不要用第乙個數,如果原始資料是倒序,效率將會很低)。

2.根據樞紐元把輸入資料劃分成為兩部分,左半部分的數比樞紐元小,右半部分比樞紐元大。

3. 分別對左半部分和右半部分遞迴呼叫快排,最終得到排序結果。

最難的是第二步,也就是分割槽函式。

首現把樞紐元放在最左邊,設定兩個指標low和high,分別指向除樞紐元外的左右兩端;

找到左邊第乙個比樞紐元大的數,並且找到右邊第乙個樞紐元小的數,如果low

在迴圈條件部分,左邊元素的判斷,一定要加等號和low

array[low] <= pivot && low < high
右半部分則不用加

上次快排**寫錯了,糾正一下,中間while(true)的部分是改完後的**,交換分割特別要注意

快排**

public void quicksort(int array,int left,int right)			}	

/* * 將其他數與樞紐元比較,比樞紐元小的放在樞紐元左邊,比它大的放在右邊,劃分為兩個部分

*/public int partition(int array,int left,int right)else

} /*

* 將放在最左邊的樞紐元與high指標上的數交換,

* 至此樞紐元左邊的數都是小於它的數,右邊的數都是大於它的數

*/swap(array,left,high);

return high; }

/* * 三數中值分割法確定樞紐元,取left,right,center三個數的中值

*/public int median3(int array ,int left,int right)

if(array[left] > array[right])

if(array[right] < array[center])

//經過以上三個判斷,中值在center位上

swap(array,center,left);//把樞紐元放在最左邊

return array[left];//樞紐元的值

} /*

* 將i和j上的數字交換

*/public void swap(int array,int i,int j)

主程式呼叫:

int  array = ;

quicksort.quicksort(array, 0, array.length-1);

用同樣的測試資料,可以做實驗得到氣泡排序,需要交換的次數是50次,而快排只需要32次,故快排比冒泡快一些

在資料量小於20時,用插入排序速度比快排要快,而資料量大於20後,就盡量用快排

二.歸併排序

思路:遞迴+合併有序陣列。

首先將陣列分成左右兩部分,然後分別遞迴歸併左右部分。然後將已排好序的兩部分合併。

合併的演算法需要用到臨時變數,所以歸併排序空間複雜度為o(n).

void mergesort(int a)

void mergesortrec(int a,int temp,int left,int right)

int temp=0;

//刪除堆的根節點(把它與最後的葉子節點(除了已排好序的)交換)

for(int i=length-1;i>=0;i--)

} /*

* 在a[0..n-1]範圍內調整第i個數,進行下沉操作,調整成最大堆

*/void heapadjust(int a,int i,int n)

if(rightchild < n && a[rightchild]>a[largerindex])

if(largerindex != i)else} }

一些結論:

1. 堆排序和快速排序的複雜度都是nlogn,但一般使用快速排序。因為堆排序在二叉樹用上浮的方式構造堆,元素交換的跨度較大。

各種排序演算法比較

花了很長時間終於把排序的基礎學了一下,這段時間學了很多東西,總結一下 學的排序演算法有 插入排序,合併排序,氣泡排序,選擇排序,希爾排序,堆排序,快速排序,計數排序,基數排序,桶排序 沒有實現 比較一下學習後的心得。我不是很清楚他們的時間複雜度,也真的不知道他們到底誰快誰慢,因為書上的推導我確實只是...

各種排序演算法比較

排序相關的演算法複雜度分析 下邊分別實現下各個演算法 簡單選擇排序 1 簡單選擇排序 2void select sort int a,intn 3 16 17swap a i a index 18 19 這裡簡單選擇排序之所以不穩定是因為交換的時候會打亂順序,例如 5,4,5,1,6。第一次交換後會...

各種排序演算法的比較

排序問題的解決方案是演算法問題當中最多的,常見的有插入排序,選擇排序,氣泡排序,歸併排序,快速排序,堆排序等,下面將對不同的排序演算法進行分析。假設均為實現從小到大排序,計算空間複雜度時,不考慮原本儲存元素的空間,只考慮實現演算法需要的額外空間。插入排序的基本思想是 從待排序的元素中選出乙個,插入已...