1. 程式人生 > >沒有物件也沒有new方法的大白

沒有物件也沒有new方法的大白

快速排序

  • 核心思想:
    快速排序就是立一個數作為基準數,比他小的統統放左邊,比他大的統統放在他的右邊,接著通過遞迴,對它的左邊序列,右邊序列重複此過程,直到無數可分
  • 複雜度分析
    • 最好情況:O(nlogn)
    • 最差情況:O(n^2)
    • 平均情況:O(nlogn)
    • 輔助空間:O(logn)~O(n)
    • 穩定性:不穩定

圖解

如序列{6,1,2,7,9,3,4,5,10,8}

6作為基準數,左右安排兩個哨兵i,j
這裡寫圖片描述

哨兵i碰到比6小的就一路向右走(碰到比6大的就停下),哨兵j碰到比6大的,就一路向左走(碰到比6小的停下)
這裡寫圖片描述
兩者都停下時就進行交換,交換後的效果如下

這裡寫圖片描述

接著兩哨兵繼續走,
這裡寫圖片描述


兩者都停下時便交換
這裡寫圖片描述

直到兩者相遇
這裡寫圖片描述

此時可以選擇和基準數交換位置
這裡寫圖片描述

這裡寫圖片描述
此時,以6為基準數的排序就完成了,接著以3為基準數重複此過程,再一下一個基準數重複,直到有序

完整過程如下圖
完整排序過程如圖
程式碼如下

#include <iostream>

void swap(int *&arr,int i,int j){
    int temp=arr[i];
    arr[i]=arr[j];
    arr[j]=temp;
}

int sortCore(int *arr,int start,int end){//快速排序 
    int i=start;
    int
j=end; int temp=arr[start]; while(i!=j){//定義兩個一頭一尾的哨兵 while(arr[j]>temp){//尾哨兵從後往前掃描,碰到比基準數大的就往前走 j--; } while(arr[i]<temp){//頭哨兵從前往後掃,碰到比基準數小的往後走 i++; } swap(arr,i,j); } return i; } void quickSort(int *arr,int start,int
end){ int i; if(start<end){ i=sortCore(arr,start,end); quickSort(arr,start,i-1); quickSort(arr,i+1,end); } } int main(int argc, char** argv) { int arr[]={2,23,54,12,13,64,7,10}; quickSort(arr,0,7); for(int i=0;i<8;i++){ printf("%d ",arr[i]); } return 0; }