分治與遞迴之快速排序

2021-10-02 01:18:58 字數 2422 閱讀 1739

第一種思路

演算法描述:快速排序首先選擇陣列第乙個元素為基準元素,從游標1從第2個元素開始,游標2從最後乙個元素開始掃瞄,但游標1找到比基準元素大,停止掃瞄,游標2開始掃瞄,找到比基準元素小的元素,停止掃瞄,交換兩個元素,以此類推,但游標1的下標大於或等於游標2,則基準元素與當前游標2為下標的元素交換,第一趟排序結束。而後陣列被分為三部分。繼續對左右子陣列進行同樣操作,最後合併。

**描述:

public

class

quicksort

}public

static

intpartiton

(int

arr,

int left,

int right)

while

(arr[right]

>=temp&&strat<=right)

if(start//進行交換

else

break;}

//確定了基準元素的位置

arr[left]

=arr[right]

; arr[rigth]

=temp;

return right;

}public

static

void

main

(string[

] args)

;quicksort

(arr,

0,arr.length-1)

;system.out.

print

(arrays.

tostring

(arr));

}}

第二種思路:以陣列第乙個元素為基準,游標j從後面開始掃瞄,當找到比基準元素小的元素,將a[j]賦值給a[i],此時游標i從前面開始掃瞄,當找到比基準元素大的元素,將當前的a[i]賦值給a[j],依次類推,到最外層迴圈結束,將基準元素賦值給a[i],一次快速排序結束。後面也類似。

**:

public

class

quicksort2

}public

static

intpartition

(int

arr,

int i,

int j)

if(iwhile

(iarr[i])if

(i} arr[i]

=temp;

return i;

}public

static

void

main

(string[

] args)

;quicksort2

(arr,

0,arr.length-1)

; system.out.

print

(arrays.

tostring

(arr));

}}

快速排序最好的情況下,將規模為n的問題分解為兩個規模為n/2的子問題。時間複雜度為o(nlogn);

快速排序的執行效率取決於基準元素的選擇,如果給點的陣列本身就有序,那麼每次選擇第乙個元素為基準元素,就會出現劃分不平衡的情況,最壞時間複雜度為o(n的平方);可採用平衡快速排序法和基於隨機支點選擇的快速排序法。

平衡快速排序:取陣列開頭、中間和結尾的元素,在三個元素中取中值元素,將中值元素作為基準元素。

基於隨機支點選擇:取陣列中的隨機元素為基準元素。

隨機支點選擇的**:

public

class

randomquicksort

}public

static

intrandompartition

(int

a,int low,

int high)

if(lowwhile

(low<=temp)

if(low} a[low]

=temp;

return low;

}public

static

void

exchange

(int

a,int i,

int j)

//將隨機選取的基點元素放在首位

public

static

void

main

(string[

] args)

;randomquicksort

(arr,

0,arr.length-1)

; system.out.

print

("隨機支點快速排序"

+arrays.

tostring

(arr));

}}

遞迴與分治 快速排序

描述 給定乙個數列,用快速排序演算法把它排成公升序。輸入 第一行是乙個整數n n不大於10000 表示要排序的數的個數 下面一行是用空格隔開的n個整數。輸出 輸出排序後的數列,每個數字佔一行。輸入樣例 5 3 2 1 4 5 輸出樣例 1 2345 基本思想 讓數列中的乙個數成為劃分基準,比這個基準...

分治與遞迴 快速排序

快速排序的基本思想可以這樣來理解 對一組待排序元素,選定其中乙個元素x為基準,將小於x的元素移動到其左邊,將大於x的元素移動到其右邊,然後對於x左邊與右邊的序列進行上述的操作直至排序完成。該演算法時間複雜度最壞的情況出現在待排序列為正序或者逆序時。此時的時間複雜度為o n2 平均時間複雜度為o nl...

ACM 歸併排序與快速排序(遞迴與分治)

歸併排序的內容可在紫書p226裡面檢視,紫書裡的 寫得十分簡潔,高效,重點要理解好循壞條件的控制。快排可參考以下的部落格 歸併排序時間複雜度 o nlogn 快排時間複雜度 平均o nlogn 最慢o n 2 歸併排序穩定但佔空間比較大,快排佔空間較小但不穩定。以下為 實現 includeusing...