挖坑法 指標交換法實現快速排序

2021-10-10 03:20:28 字數 3095 閱讀 1125

參考資料

同氣泡排序一樣, 快速排序也是交換排序, 但是採用了分治的思想, 所以效率比氣泡排序高很多

氣泡排序每一輪都找出最大的元素到數列的一端; 而快排挑選乙個基準元素, 將比基準元素大移動到數列一端, 比基準元素小的移動到另一端, 將數列分成兩部分

下面幾種實現, 推薦指標交換法(雙邊指標), 容易理解

平均時間複雜度為o(nlogn), 最壞時間複雜度為o(n2)

基準元素位置相當於乙個坑, 右側的小於基準元素就右側這個位置為新坑; 左側的大於基準元素, 左側這個則為新坑(用新坑的值填舊坑的值, 因為最開始的坑是基準元素, 所以要儲存基準元素值, 最後替換最後坑的值)

//挖坑法 遞迴實現 雙向

public

static

void

quicksort1

(int

arr,

int startindex,

int endindex)

int pivotindex =

partition1

(arr, startindex, endindex)

;quicksort1

(arr, startindex, pivotindex-1)

;quicksort1

(arr,pivotindex+

1, endindex);}

//挖坑法

public

static

intpartition1

(int

arr,

int startindex,

int endindex)

right--;}

//left指標從左向右移動

while

(right >= left)

left++;}

}//用基準元素替換最後坑的位置

arr[index]

= pivot;

return index;

}

指標交換法, 雙邊遍歷, 右邊找小於pivot的停下, 左邊找大於pivot的停下, 然後左右交換, 最後用pivot和重合位置的元素交換

注意: pivot元素選取影響處理順序, 見**注釋詳細說明

//指標交換法 雙邊指標 遞迴實現 雙向

public

static

void

quicksort2

(int

arr,

int startindex,

int endindex)

int pivotindex =

partition2

(arr, startindex, endindex)

;quicksort1

(arr, startindex, pivotindex-1)

;quicksort1

(arr,pivotindex+

1, endindex);}

//指標交換法 雙邊遍歷, 右邊找小於pivot的停下, 左邊找到大於pivot的停下, 互換位置, 最後將pivot和指標重合處替換

public

static

intpartition2

(int

arr,

int startindex,

int endindex)

while

(right > left && arr[left]

<= pivot)

// while(right > left && arr[right] >= pivot)

if(left < right)

}//pivot指標和重合點交換 左邊都小於pivot 右邊都大於pivot 此輪結束

int p = arr[left]

; arr[left]

= arr[startindex]

; arr[startindex]

= p;

return left;

}

//指標交換法 遞迴實現 單邊

public

static

void

quicksort3

(int

arr,

int startindex,

int endindex)

int pivotindex =

partition3

(arr, startindex, endindex)

;quicksort3

(arr, startindex, pivotindex-1)

;quicksort3

(arr,pivotindex+

1, endindex);}

//指標交換法 單邊遍歷

public

static

intpartition3

(int

arr,

int startindex,

int endindex)

}//注意這裡啊

int temp = arr[mark]

; arr[mark]

= pivot;

arr[startindex]

= temp;

return mark;

}

絕大多數遞迴實現的問題都可以使用棧來實現, 因為遞迴呼叫本身就是乙個函式棧

進入乙個新方法, 相當於入棧; 方法返回, 相當於出棧; 遞迴轉化棧, 在棧中儲存每一次方法呼叫的引數

//快排 棧實現 使用的雙邊、指標交換法

public

static

void

quicksortwithstack

(int

arr,

int startindex,

int endindex)

if(param.

get(

"endindex"

)> pivot +1)

}}

練手》快速排序 比較交換法

快速排序 快速排序是比較類排序,是氣泡排序的公升級,時間複雜度o nlog2 n 快速排序選定陣列中的乙個數,小的在其前面,大的在其後面 之後該陣列前面一部分與後面一部分作為新的陣列進行排序 include include using namespace std intpartsort vector...

C語言 交換法排序

交換法排序 題目內容 從鍵盤輸入n個 n 10 整數,用交換法進行排序 非遞減有序 結果輸出排序後的序列。說明 交換法排序用函式實現,函式原型為 void sort int a,int n 交換法排序的基本思想是 n個元素共需要n 1趟,其中第i 從0變化至n 2 趟的任務是找出本趟中最小的元素放在...

陣列排序(交換法與選擇法)

交換法對陣列陣列進行排序的基本思路 就是先讓陣列 n個數 中的最左邊的乙個數 用i 0代表 與其右邊的每乙個數 從j i 1開始 依次 j 進行比較,若遇到比其大的數 score j score i 則將較大的那個數的值賦給自己,自己成為較大數繼續與後面的數比較,以此類推,一輪後 即j n時 讓i自...