快速排序三種實現
學習演算法最快方式:直接看標準程式碼。 note :我們不為提高智商,我們僅僅想快速 「體驗|接受」 演算法的感覺,並熟練掌握
看完程式碼後,拿出值和筆推畫出程式碼的過程 | 或debug;
如果有哪一行程式碼沒有理解,很可能是(你的初始資料或case)沒有推畫或debug出對應的邊界條件
快速排序經典演算法:
public static void quick_sort(int[] arr, int l, int r) {
if (l < r) {
int mid = mid_index(arr, l, r);
quick_sort(arr, l, mid - 1);
quick_sort(arr, mid + 1, r);
}
}
private static int mid_index(int[] arr, int l, int r) {
int pivot_val = arr[l];
while (l < r) {
while (arr[r] >= pivot_val && l < r) {
r--;
}
if (l < r) {
arr[l++] = arr[r];
}
while (arr[l] <= pivot_val && l < r) {
l++;
}
if (l < r) {
arr[r--] = arr[l];
}
}
arr[l] = pivot_val;
return l;
}
快速排序三路演算法:
三路演算法新增隨機過程可避免 經典演算法中 遇到已拍好序的資料時間複雜度退化為O(n*n)
public static void three_quick_sort(int[] arr, int l, int r) {
if (l < r) {
int mid = three_mid_index(arr, l, r);
three_quick_sort(arr, l, mid - 1);
three_quick_sort(arr, mid + 1, r);
}
}
private static int three_mid_index(int[] arr, int l, int r) {
int index = l + (int)(Math.random() * (r - l + 1));
swap(arr, index, r);
int small = l - 1;
for (index = l; index < r; index++) {
if (arr[index] < arr[r]) {
small++;
if (small != index) {
swap(arr, small, index);
}
}
}
swap(arr, small + 1, r);
return small + 1;
}
public static void swap(int[] arr, int l, int r) {
int temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
快速排序非遞迴實現
public static void stack_quick_sort(int[] arr, int l, int r) {
Stack<Integer> stack = new Stack<>();
do {
if (!stack.isEmpty()) {
l = stack.pop();
r = stack.pop();
}
// three_mid_index mid_index 都可以
int mid_idx = mid_index(arr, l, r);
if (l < mid_idx - 1) {
stack.push(mid_idx - 1);
stack.push(l);
}
if (mid_idx + 1 < r) {
stack.push(r);
stack.push(mid_idx + 1);
}
} while (!stack.isEmpty());
}
private static int mid_index(int[] arr, int l, int r) {
int pivot_val = arr[l];
while (l < r) {
while (arr[r] >= pivot_val && l < r) {
r--;
}
if (l < r) {
arr[l++] = arr[r];
}
while (arr[l] <= pivot_val && l < r) {
l++;
}
if (l < r) {
arr[r--] = arr[l];
}
}
arr[l] = pivot_val;
return l;
}
相關文章
- 快速排序的三種實現方法 (C++)排序C++
- 三種快速排序排序
- 三種語言實現快速排序(C++/Python/Java)排序C++PythonJava
- 快速排序的四種python實現排序Python
- java實現快速排序Java排序
- Swift實現快速排序Swift排序
- GO 實現快速排序Go排序
- 快速排序(java實現)排序Java
- 快速排序 java實現排序Java
- php實現 歸併排序,快速排序PHP排序
- Python實現的快速排序Python排序
- 快速理解7種排序演算法 | python3實現(排序演算法Python
- Go實現氣泡排序和快速排序Go排序
- 【資料結構與演算法】快速排序(三種程式碼實現以及工程優化)資料結構演算法排序優化
- 排序演算法之快速排序的實現排序演算法
- JavaScript實現標準快速排序JavaScript排序
- Python3實現快速排序Python排序
- 三種語言實現歸併排序(C++/Python/Java)排序C++PythonJava
- 三路快速排序排序
- Sort排序專題(5)快速排序(QuickSort)(C++實現)排序UIC++
- 排序演算法-Java實現快速排序演算法排序演算法Java
- python實現氣泡排序、插入排序以及快速排序演算法Python排序演算法
- 隨機快速排序Java程式碼實現隨機排序Java
- 快速排序演算法C++實現排序演算法C++
- 歸併排序與快速排序的一個實現與理解排序
- C++快速排序與歸併排序的實現(LeetCode 912)C++排序LeetCode
- 七、排序,選擇、冒泡、希爾、歸併、快速排序實現排序
- 直播系統原始碼,實現快速排序和歸併排序原始碼排序
- php實現4種排序演算法PHP排序演算法
- PHP 常見4種排序 氣泡排序、選擇排序、插入排序、快速排序PHP排序
- 九種排序演算法的 JavaScript 實現排序演算法JavaScript
- python實現常用五種排序演算法Python排序演算法
- JavaScript實現的7種排序演算法JavaScript排序演算法
- 二十、快速排序演算法——JAVA實現(遞迴)排序演算法Java遞迴
- springAOP的三種實現方式Spring
- Go 中的三種排序方法Go排序
- Array.sort 演算法原理(插入排序\快速排序in-place實現)演算法排序
- JS快速排序&三路快排JS排序