《算法导论》学习笔记——快速排序
快速排序
1.快速排序原理
??快速排序是一種應用很廣泛的排序算法,與歸并排序類似,快速排序也采用了分治策略。對于一個待排序的數組A[p...r]進行快速排序,根據分治思想,可以分為如下三個步驟:
??- 分解:數組A[p...r]被劃分為兩個(有可能為空)子數組A[p...q-1]和A[q+1...r],使得A[p...q-1]中的每一個元素都小于等于A[q],而A[q]也小于等于A[q+1...r]中的每一個元素。其中,計算下標q也是劃分過程的一部分。
??-解決:通過遞歸調用快速排序,對子數組A[p...q-1]和A[q+1...r]進行快速排序。
??-合并:注意到與歸并排序不同,快速排序算法中的子數組都是基于原址排序的,所以不需要合并操作,即數組A[p...r]已經排好了順序。
??對于快速排序來說,算法的關鍵是找到正確的劃分q,該過程的偽代碼如下:
PARATITION(A, p, r)x = A[r]i = p - 1for j = p to r - 1if A[j] <= A[r]i = i + 1exchange A[i] with A[j]exchange A[i + 1] with A[r]return i + 1??下面這張圖顯示了該過程。
??隨著算法的執行,數組被劃分為4個(可能為空)區域,如下圖所示:
??1. 若p <= k <= i,則A[k] <= x;
??2. 若i+1 <= k <= j-1,則 A[k] >x;
??3. 若j < k < r,則A[k]與x的大小關系不明確;
??4. 若k = r,則A[k] = r。
2.快速排序的性能
??根據上面的分析,快速排序的運行時間依賴于對待排序數組A[p...r]的劃分是否平衡,而是否劃分平衡依賴于劃分元素的選取,如果劃分是平衡的,那么快速排序算法性能與歸并排序一樣;如果劃分不平衡,那么快速排序的性能就接近于插入排序了,注意這里是接近,而不是相等!
??結論:平均情況下,快速排序的時間復雜度與最好劃分情況下數量級一致,均為O(nlogn),注意這里是數量級一致并不意味著時間復雜度相等!
3.快速排序的隨機化版本
??上述的快速排序在討論平均性能時我們假設輸入數據的所有排列都是等概的。但實際情況可能并非如此,有可能出現元素大小分布極不均衡的情況??梢圆捎靡环N稱為隨機抽樣(random sampling)的隨機化技術,使主元A[r]是一個隨機抽取于數組中的元素,因為主元元素是隨機抽取的,我們期望在平均情況下,對輸入數組的劃分是比較均衡的。采取這樣的操作只需要在原來的算法上改動很小的部分即可,偽代碼如下:
RANDOMIZED-PARTITION(A, p, r)i = RANDOM(p, r)exchange A[r] with A[i]return PARATITION(A, p, r)4.代碼實現(C/C++,Java,Python)
??實現了快速排序最基本算法,沒有考慮隨機化版本=。=
C
#include <stdio.h> #include <stdlib.h>void swap(int* a, int* b) {int tmp;tmp = *a;*a = *b;*b = tmp; }int partition(int* array, int low, int high) {int mid, index;mid = low - 1;for(index = low; index < high; index++){if(array[index] <= array[high]) {mid += 1;swap(&array[mid], &array[index]);}}swap(&array[mid + 1], &array[high]);return mid + 1; }void quicksort(int* array, int low, int high) {int mid;if(low < high){mid = partition(array, low, high);quicksort(array, low, mid - 1);quicksort(array, mid + 1, high);} }int main() {int *array, length, i;printf("Enter the length of array: ");scanf("%d", &length);array = (int* )malloc(length * sizeof(int));for(i = 0; i < length; i++)scanf("%d", &array[i]);quicksort(array, 0, length - 1);for(i = 0; i< length; i++)printf("%d ", array[i]);free(array);return 0; }C++
#include <iostream> #include <vector> using namespace std;void swap(int* a, int* b) {int tmp;tmp = *a;*a = *b;*b = tmp; }int partition(vector<int> &array, int low, int high) {int mid, index;mid = low - 1;for(index = low; index < high; index++){if(array[index] <= array[high]) {mid += 1;swap(&array[mid], &array[index]);}}swap(&array[mid + 1], &array[high]);return mid + 1; }void quicksort(vector<int> &array, int low, int high) {int mid;if(low < high){mid = partition(array, low, high);quicksort(array, low, mid - 1);quicksort(array, mid + 1, high);} }int main() {vector<int> array;int length, element;cout << "Enter the length of array: ";cin >> length;cout << "Enter the element of array: ";for(int i = 0; i < length; i++){cin >> element;array.push_back(element);}quicksort(array, 0, length - 1);for(int i = 0; i< length; i++)cout << array[i] << " ";return 0; }Java
import java.util.*;public class QuickSort {public static void display(Iterator<Integer> it) {while(it.hasNext()) {Integer element = it.next();System.out.print(element + " ");}}public static void main(String[] args) {ArrayList<Integer> array = new ArrayList<Integer>();Scanner in = new Scanner(System.in);System.out.print("Enter the length of array: ");int length = in.nextInt();System.out.print("Enter the element of array: ");for(int i = 0; i < length; i++)array.add(in.nextInt());in.close();Sort sort = new Sort(array);sort.quickSort(sort.getLow(), sort.getHigh());display(array.iterator());} }class Sort {public Sort(ArrayList<Integer> array) {this.array = array;}public int getLow() {return 0;}public int getHigh() {return array.size() - 1;}public void quickSort(int low, int high) {int mid;if(low < high) {mid = partition(low, high);quickSort(low, mid - 1);quickSort(mid + 1, high);}}public int partition(int low, int high) {int index = low - 1;for(int i = low; i < high; i++) {if(array.get(i) <= array.get(high)) {index += 1;int[] list = swap(array.get(index), array.get(i));array.set(index, list[0]);array.set(i, list[1]);}}int[] list = swap(array.get(index + 1), array.get(high));array.set(index + 1, list[0]);array.set(high, list[1]);return index + 1;}public int[] swap(int a, int b) {int[] list = new int[2];list[0] = b;list[1] = a;return list;}private ArrayList<Integer> array; }Python
quickSort.py
def swap(A, i, j):tmp = A[j]A[j] = A[i]A[i] = tmpdef partition(A, low, high):mid = low - 1for i in range(low, high):if A[i] <= A[high]:mid += 1swap(A, mid, i)swap(A, mid + 1, high)return mid + 1def quickSort(A, low, high):if low < high:mid = partition(A, low, high)quickSort(A, low, mid - 1)quickSort(A, mid + 1, high)test.py
import quickSortA = [8, 7, 3, 0, 5, 4, 2, 9, 6, 1, 4] quickSort.quickSort(A, 0, len(A) - 1) print A轉載于:https://www.cnblogs.com/zhxbao/p/quick_sort.html
總結
以上是生活随笔為你收集整理的《算法导论》学习笔记——快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 高性能服务器编程——多线程编
- 下一篇: Fix chrome 下flash cr