演算法 快速排序

2021-08-15 17:17:31 字數 2232 閱讀 5682

同步更新。歡迎移步體驗更好的閱讀效果。

快速排序通過將乙個陣列劃分成兩個子陣列, 然後通過遞迴呼叫自身為每乙個子陣列進行快速排序來實現.

設定關鍵字(基準數), 將比關鍵字小的放在一組, 比關鍵字大的放在另一組.

下面將以陣列[6,1,2,7,9,3,4,5,10,8]為例, 演示排序過程

先把陣列中的乙個數當做基準數, 一般會把陣列中最左邊的數當做基準數, 然後從兩邊進行檢索. 先從陣列的右邊檢索比基準數小的, 再從左邊檢索比基準數大的. 如果檢索到了, 就停下, 然後交換這兩個元素, 然後再繼續檢索.

i和j一旦相遇, 就停止檢索, 把基準數和相遇位置的元素交換

基準數和相遇位置的元素交換完成後, 表示第一輪排序結束, 此時陣列的特點: 基準數左邊的元素都比它小, 右邊的元素都比它大.

接下來, 先排基準數左邊的陣列, 排完之後再排基準數右邊的陣列, 方式和第一輪一樣, 整個過程如下圖

最壞:o(n^2)

平均: o(nlogn)

不穩定, 比如序列為 (5, 3, 3, 4, 3, 8, 9, 10, 11), 第一輪中, 基準數5和第5位置的3交換, 就會破壞穩定性

public

class

quicksort

// i 從左往右檢索

while

(arr[i]

<= base && i < j)

// i停下了, j也停下, 交換兩個位置的元素

int temp = arr[i]

; arr[i]

= arr[j]

; arr[j]

= temp;

}// 如果i和j相遇了, 就交換基準數和相遇位置的元素

arr[left]

= arr[i]

; arr[i]

= base;

// 基準數在這裡就歸位了, 左邊的數字都比它小, 右邊的數字都比它大.

// 排基準數左邊的陣列

quicksort

(arr, left, i -1)

;// 排基準數右邊的陣列

quicksort

(arr, j +

1, right);}

public

static

void

main

(string[

] args)

;quicksort

(arr,

0, arr.length -1)

; system.out.

println

(arrays.

tostring

(arr));

}}

int partition(int l, int low, int high)//對子表進行一趟排序,返回樞軸位置

l[low] = l[0];

return low;

}void qsort(int l, int low, int high)

}

如果l[0]上面有數字(不閒置),稍微改動一下就可以了

int patition(int l, int low, int high)

l[low] = temp;

return low;

}void qsort(int l, int low, int high)

}

排序演算法 快速排序演算法

網際網路的大型公司還在火熱招聘中,參與了一次又一次的筆試,都不通過,我還是太菜!作為程式設計人員,需要邁過去 資料結構與演算法 這個坎,畢竟,筆試不會真的很虧,加油吧,少些水,多點實操。一 快速排序演算法思想 從一組資料中找出乙個基準值,一般是選擇中間值作為基準值,然後從左到右將值與基準值進行比較,...

演算法 排序演算法 快速排序

快速排序是對冒泡法排序的一種改進。快速排序演算法 的基本思想是 將所要進行排序的數分為左右兩個部分,其中一部分的所有資料都比另外一 部分的資料小,然後將所分得的兩部分資料進行同樣的劃分,重複執行以上的劃分操作,直 到所有要進行排序的資料變為有序為止。可能僅根據基本思想對快速排序的認識並不深,接下來以...

演算法設計 快速排序 隨機快速排序演算法

1.演算法流程 快速排序的時間複雜性分析 1.最壞情況劃分 當劃分產生的兩個子問題分別包含了n 1個元素和0個元素時,快速排序是最壞情況,假如每次遞迴呼叫,總是出現最不平衡劃分,這是最不平衡劃分。劃分操作時間複雜度為 n 則演算法執行時間的遞迴表示式為t n t n 1 t 0 n 利用代入法可以求...