快速排序

什么是快速排序?

快速排序由C. A. R. Hoare在1962年提出。

它的基本思想是:

通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小.

然后再按此方法對這兩部分數(shù)據(jù)分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序序列。

實現(xiàn)思路:

1.先從數(shù)列中取出一個數(shù)作為基準數(shù)。

2.分區(qū)過程,將比這個數(shù)大的數(shù)全放到它的右邊,小于或等于它的數(shù)全放到它的左邊。

3.再對左右區(qū)間重復第二步,直到各區(qū)間只有一個數(shù)。

過程圖解:

如上圖所示,經(jīng)過第一輪劃分以后,數(shù)組以32位界限被分成了兩部分,左邊的都比32小,右邊的都比32大,接下來只要對兩個分區(qū)重復上述步驟,直到每個分區(qū)都只有一個數(shù)據(jù)位置。

代碼實現(xiàn):

/**

* @param s

* @param l

* @param r

*/

static void quickSort(int s[], int l, int r) {

if (l < r) {

int i = l, j = r, x = s[l];

while (i < j) {

while (i < j && s[j] >= x)

// 從右向左找第一個小于x的數(shù)

j--;

if (i < j)

s[i++] = s[j];

while (i < j && s[i] < x)

// 從左向右找第一個大于等于x的數(shù)

i++;

if (i < j)

s[j--] = s[i];

}

s[i] = x;

quickSort(s, l, i - 1); // 遞歸調(diào)用

quickSort(s, i + 1, r);

}

}


總結(jié):

時間復雜度:O(n*lgn)

最壞:O(n^2)

空間復雜度:O(n*lgn)

穩(wěn)定性:不穩(wěn)定。

快速排序是一種排序算法,對包含n個數(shù)的輸入數(shù)組,平均時間為O(nlgn),最壞情況是O(n^2)。

通常是用于排序的最佳選擇。因為,基于比較的排序,最快也只能達到O(nlgn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • quicksort可以說是應(yīng)用最廣泛的排序算法之一,它的基本思想是分治法,選擇一個pivot(中軸點),將小于pi...
    黎景陽閱讀 458評論 0 1
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,768評論 0 33
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,759評論 18 399
  • 總結(jié)一下常見的排序算法。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序。外排序:指在排序...
    jiangliang閱讀 1,375評論 0 1
  • 《畫魂》 作者:李恩揮 我的家里最近安置了一個新家具,梅雨送我的,一張棕紅色帶著香味兒的沙發(fā)。這張沙發(fā)有三個坐墊,...
    李恩揮閱讀 4,801評論 11 49