快速排序是比較經典、常用的演算法,下面簡要介紹其思路。對於乙個陣列,選取某個元素作為切分元素(比如第乙個元素),然後把比這個元素小的都放到它前面,比這個元素大的都放到它後面,這樣切分元素的最終位置就確定了,並且陣列被劃分為兩個子陣列。然後再用同樣的方法分別對子陣列進行排序,最終整個陣列將變成有序的。
這裡的關鍵是實現陣列劃分的方法,這裡舉例說明。假如要對陣列a=
排序,選取a[0]
作為切分元素,排序過程如下:
5,3,6,5,8,4,7
i j
5,3,6,5,8,4,7
i j
5,3,4,5,8,6,7
ij
如上所示,剛開始i
指向陣列第乙個元素,而j
指向陣列末尾元素後乙個位置,i
從前往後掃瞄,直到找到乙個大於等於切分元素時停下(這裡是6
),j
從後往前掃瞄,直到找到乙個小於等於切分元素的時候停下(這裡是4
),然後交換這兩個元素。然後繼續尋找直到兩個指標相遇,則本輪掃瞄結束。此時j<=i
,j
右邊的元素均大於切分元素,交換a[j]
與切分元素即可。接著對兩個子陣列
以及
繼續用剛才的方法排序,最終陣列將全部有序。**實現如下:
void sort(int a, int lo, int hi)
int partition(int a, int lo, int hi)
swap(a, lo, j);
return j;
}
對於快速排序有幾點說明:
對於快速排序有3點優化思路:
對於小陣列,可以採用插入排序,避免遞迴呼叫。例如,當if(hi <= lo + m)
時,就可以轉到插入排序。
採用子陣列的一部分元素的中位數來切分陣列。這樣做得到的切分更好,但代價是需要計算中位數。
如果陣列中含有大量的重複元素,可以採用三向切分。將陣列切分為三部分,分別對應於小於、等於和大於切分元素的陣列元素。**實現如下:
private static void sort1(int a, int lo, int hi) else if (a[i] > v) else
sort(a, lo, lt - 1);
sort(a, gt + 1, hi);
}
快速排序的陣列切分還有另一種單向掃瞄的版本,具體步驟是選擇陣列中最後乙個元素作為切分元素,同樣設定兩個指標,指標i
指向陣列中第乙個元素前面乙個位置,j
則指向陣列中第乙個元素。j
從前左右往右掃瞄,遇到小於等於切分元素時就把i
加一,然後交換i
和j
指向的元素。最後把i+1
位置的元素和切分元素交換即可完成一次陣列劃分。**實現如下:
int partition(int a, int lo, int hi)
j++;
}swap(a, i + 1, hi);
return i + 1;
}
快速排序及其優化
include include 呼叫c 自帶sort include include include using namespace std define max 1000000 define k 12 ifdef debug define new new normal block,file lin...
快速排序及其優化
package com.zc.algorithm public class quicksort 如果不大於,則把右邊的數賦值給左邊 arr left arr right 如果左邊的數小於基數,則向右移動 while left arr right 把最大值放在陣列的末尾 if arr mid arr ...
排序 快速排序及其優化
在排序中交換數字,達到排序的目的 由於 是c語言寫的,所以需要給出交換函式 如果是c 那麼就直接用交換函式 void swap int left,int right 先標記基準值 這裡先取最後乙個元素為基準值,記錄起來 之後定義兩個指標,然後前後遍歷,找到比基準值大的或者小的的元素的位置,然後進行標...