深刻理解 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 指...