快速排序算法
入菊厂两年了,光阴似箭让人唏嘘不已。业务代码确实写了不少,好像什么都知道一点却又不精通,学校学的都忘光了,博客也太久没动过了,实在惭愧。最近打算一点点捡起来,诸君共勉。直接上java代码。
参考了两位同学的博客,传送门:
https://blog.youkuaiyun.com/tomcmd/article/details/48009195
https://blog.youkuaiyun.com/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();
}
}
“`