穩定的排序演算法有:直接插入,冒泡,歸併,基數排序。
一.快速排序
快排的三個步驟:
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。第一次交換後會...
各種排序演算法的比較
排序問題的解決方案是演算法問題當中最多的,常見的有插入排序,選擇排序,氣泡排序,歸併排序,快速排序,堆排序等,下面將對不同的排序演算法進行分析。假設均為實現從小到大排序,計算空間複雜度時,不考慮原本儲存元素的空間,只考慮實現演算法需要的額外空間。插入排序的基本思想是 從待排序的元素中選出乙個,插入已...