快速排序算法
入菊廠兩年了,光陰似箭讓人唏噓不已。業務代碼確實寫了不少,好像什麼都知道一點卻又不精通,學校學的都忘光了,博客也太久沒動過了,實在慚愧。最近打算一點點撿起來,諸君共勉。直接上java代碼。
參考了兩位同學的博客,傳送門:
https://blog.csdn.net/tomcmd/article/details/48009195
https://blog.csdn.net/mingming_shiwo/article/details/75566706
“`
package com.huawei.sort;
public class TestQuickSort {
/*
快速排序
算法思路:
1.首先採用分治的思想,選取基準值把序列分成兩個子序列,基準值左側的子序列都比基準值小,
而基準值右側的子序列都比基準值大。
2.然後用遞歸的思想,每個子序列只有一個元素時,整個序列變得有序。
算法步驟:
1.對於一個數組A(A[0]到A[n-1]),選取基準值key=A[0];
2.設置兩個變量low,high,分別指向數組的首端、尾端;
3.從尾端開始,一直high--,直到遇到比key小的元素,交換A[high]和A[low];
4.從首端開始,一直low++, 直到遇到比key大的元素,交換A[low]和A[high];
5.當low和high相等時,完成一趟快速排序,新的基準值key=A[low]
6.對於新基準值左右兩側的兩個序列,一直遞歸的進行快速排序,直到每個序列都只有1個元素,整個序列便有序了。
*/
public static void main(String[] args) {
int[] arr = { 5, 4, 3, 2, 1 };
System.out.println("before sorted arr = ");
printArr(arr);
quickSort(arr, 0, arr.length - 1);
System.out.println("after sorted arr = ");
printArr(arr);
}
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// 返回值keyPos是每次排序的基準值下標
int keyPos = findKeyPosition(arr, low, high);
// 對左邊子序列排序
quickSort(arr, 0, keyPos - 1);
// 對右邊的子序列排序
quickSort(arr, keyPos + 1, high);
}
}
/**
* 進行一趟快速排序,在排序結束後,返回新的基準值在數組中的下標
*
* @param arr
* 待排序序列
* @param low
* 指向待排序序列的首端
* @param high
* 指向待排序序列的尾端
* @return 新的基準值在數組中的下標
*/
public static int findKeyPosition(int[] arr, int low, int high) {
// 基準值key
int key = arr[low];
while (low < high) {
while (low < high && arr[high] >= key) {
high--;
}
// arr[low] = arr[high];
swap(arr, low, high);
while (low < high && arr[low] <= key) {
low++;
}
// arr[high] = arr[low];
swap(arr, low, high);
}
System.out.println("low = " + low + ",high = " + high);
// 此時low high相等,arr[low] = key亦可;
arr[high] = key;
return low;
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void printArr(int[] arr) {
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println();
}
}
“`