參考資料
同氣泡排序一樣, 快速排序也是交換排序, 但是採用了分治的思想, 所以效率比氣泡排序高很多
氣泡排序每一輪都找出最大的元素到數列的一端; 而快排挑選乙個基準元素, 將比基準元素大移動到數列一端, 比基準元素小的移動到另一端, 將數列分成兩部分
下面幾種實現, 推薦指標交換法(雙邊指標), 容易理解
平均時間複雜度為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自...