3 5 快速排序法

2021-12-30 05:47:09 字數 2333 閱讀 9116

深刻理解 quick sort 的 partition 的過程才有可能做出很好的實現。

quick sort,一段對於快速排序的描述:可能是二十世紀最偉大的排序演算法之一。

我們首先先寫乙個基本的快速排序演算法,後面我們再對這個基本的快速排序演算法進行優化。

從標定點後面乙個乙個地比較到底,(1)如果遇到比標定元素大的,就放過;(2)如果遇到比標定元素小的,就依次放在標定元素的後面(這句話說得有點含糊其辭,應該結合**實現去理解這句話)。

我們首先先回顧一下歸併排序:歸併排序不管陣列的內容是什麼,歸併排序總是一分為二地去做排序運算,然後再歸併起來。而快速排序的遞迴過程是這樣的:

例如:待排序陣列是

我們首先選擇陣列的第 1 個元素 4 作為基準。第 1 輪排好序以後,我們要達到的是這樣乙個效果:

第 1 個元素 4的前面的所有的數都比 4 小,後面所有的數都比 4 大,也即是說:運算之前的第 1 個元素 4 它放在了它應該在的地方(最終排好序以後,4 就是在這個位置,我們沒有理由再去無謂地挪動 4 的位置); 4 前面的元素 2,3,1 的相對位置是固定的,不保持它們原來陣列的位置,所以不是原地排序; 4 後面的元素 6,5,7,8 的相對位置是固定的,不保持它們在原來陣列中的位置,所以不是原地排序。

我們把上面這一輪的步驟稱之為 partition,partition是快速排序演算法的核心,正確地寫出 partition 函式是實現快速排序的關鍵

先寫出快速排序演算法的框架:

public class quicksorttest ;

int len = arr.length;

quicksort(arr, 0, len - 1);

}/**

* @param arr

* @param left 左邊界,可以取到

* @param right 右邊界,可以取到

*/private void quicksort(int arr, int left, int right)

int p = partition(arr, left, right);

quicksort(arr, left, p - 1);

quicksort(arr, p + 1, right);

}// 返回排好序的時候原來陣列的首個元素最終應該放置的位置

private int partition(int arr, int left, int right)

}接下來,我們就要來實現 partition 了,每一次 partition 都將後面的元素進行整理,整理以後小於 4 的元素在陣列的前半部分,大於 4 的元素在陣列的後半部分。

下面我們具體講解一下快速排序的實現。

l:通常我們選取左邊界

j:是分界點,也就是例子中 4 這個元素的位置

我們逐漸遍歷去「比較」,當前被訪問的元素是 i。

我們首先寫出來的這一版,經過隨機生成陣列元素的比較,已經比「歸併排序」效率要高了。

**實現:

/*** @param arr

* @param left

* @param right

* @return

*/private int partition(int arr, int left, int right)

}swap(arr, left, j);

return j;

}private static void swap(int arr, int index1, int index2)

下面的圖幫助我們理解 partition 的過程和邊界值的選取。

快速排序的實現也利用了「遞迴」的思想。快速排序也是另乙個o(nlogn) 級別的演算法。

對於近乎有序的陣列而言,我們這一版的快速排序在 100 萬這個級別的時候棧溢位了。

測試用例:1000000(100萬),用於比較的排序方法:歸併排序、快速排序

接下來我們來談一下,關於快速排序的優化措施。

1、底層使用插入排序,同樣,我們使用 16 作為臨界值

2、我們在腦子裡想象一些比較極端的情況,也就是每一次作為基準的值迭代以後不落在中間那個地方。

快速排序最差的情況就是在陣列近乎有序的時候,深度不是固定,最差的時候會退化成 o(n^2)。

思考一下快速排序的時間複雜度 o(nlogn) 是如何計算出來的,快速排序對於最糟糕的情況(逆序陣列的排序)是可以達到 o(n^2) 這個級別的複雜度的。

快速排序法

一 快速排序演算法的基本特性 時間複雜度 o n lgn 最壞 o n 2 空間複雜度 o n lgn 不穩定。快速排序是一種排序演算法,對包含n個數的輸入陣列,平均時間為o nlgn 最壞情況是o n 2 通常是用於排序的最佳選擇。因為,基於比較的排序,最快也只能達到o nlgn c void q...

快速排序法

include stdafx.h include vos.h define table mid machine name midmachine define table midmach colname id id define table midmach colname ip ip define t...

快速排序法

快速排序法思想 在待排序的n個資料中取第乙個數字為基準數,陣列最前面放乙個標桿,陣列最後麵放乙個標桿,通過基準數和標桿 i,j 出的數進行比較,實現每次排序完時候,共三組數,不大於基準數 基準數 不小於基準數 舉例說明 5 i 4,6,8,3,9,2 j 基準數5 標桿 i 指向5位置,標桿 j 指...