查詢與排序之快速排序

2021-10-02 13:12:19 字數 2203 閱讀 3494

將原問題劃分成若干個規模較小而結構與原問題一致的子問題,遞迴地解決這些子問題,然後合併其結果,得到原問題的解

1、演算法思路

重點:劃分,使左邊小於/大於右邊

2、快排之單向掃瞄分割槽法

/*例子:

public static void main(string args) ;

quicksort(arr, 0, arr.length-1);

for(int i=0; ipublic

static

void

quicksort

(int

arr,

int p,

int r)

}public

static

intpartition

(int

arr,

int p,

int r)

}swap

(arr, p, bigger)

;//調整主元位置

return bigger;

}public

static

void

swap

(int

arr,

int a,

int b)

3、快排之雙向掃瞄分割槽法

思路:

此時leftp位置元素與rightp位置元素交換位置,重複上述迴圈掃瞄比較

將主元與rightp指向的元素交換,放置在左小右大的位置

對==arr[0]~~arr[主元-1]和arr[主元+1]~~arr[biggerp]==進行遞迴

public

static

intpartition

(int arr,

int p,

int r)

swap

(arr, p, rightp)

;return rightp;

}

4、快排之三指標分割槽法(有大量重複)

思路:

public

static

void

quicksort03

(int arr,

int p,

int r)

}public

static

intgetright

(int

arr,

int point)

return arr.length-1;

}public

static

intpartition3

(int arr,

int p,

int r)

leftp++;}

while

(leftp <= rightp && arr[rightp]

>point) rightp--;if

(leftpswap

(arr,leftp,rightp);}

swap

(arr, p, ep-1)

;return ep-1;

}

1、三點中值法

public

static

void

quicksort04

(int arr,

int p,

int r)

}public

static

intpartition4

(int arr,

int p,

int r)

else

if(arr[r]

<=arr[midindex]

&& arr[r]

>= arr[p]

)else

swap

(arr,p,midvalueindex)

;int point = arr[p]

;//主元

int leftp = p+1;

//左指標

int rightp = r;

//右指標

while

(leftp <= rightp)

swap

(arr, p, rightp)

;return rightp;

}

2、絕對中值法(o(nlogn))

3、列表較短時,用插入排序 n<=8

排序之快速排序

快速排序的在內排中起到比較重要的作用,平均時間複雜度達到o nlogn 公升序快速排序 1 int partition vector vi,int start,int end 11 vi start key 12return start 13 14void quickcore vector vi,i...

排序之快速排序

有沒有既不浪費空間又可以快一點的排序演算法呢?那就是 快速排序 啦!光聽這個名字是不是就覺得很高階呢。假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數 不要被這個名詞嚇到了,就是乙個用來參照的數,待會你就知道它用來做啥的了 為了方...

排序之快速排序

該方法的基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數 o nlogn 出處 includeusing namespace std void quicksort int ...