版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
书读百遍,其义自见。果然每次复习都会有不同的收获。
1. 排序过程
快排的详细过程如下图所示。
1,2,3,4是一个循环,循环条件是low < high。low==high的时候退出。
然后1和3又是分别是两个循环,用来找到满足条件的数。
第一步的循环条件是low<high && arr[high] >=temp。找到小于temp的数才退出
第二步的循环条件是low<high && arr[low]<=temp。找到大于temp的数才退出。
第三步和第四步就是赋值操作了。
第三步是将找到的小于temp的数arr[high]赋值给arr[low]。
第四步是将找到的大于temp的数arr[low]赋值给arr[high]。
最后循环结束,将temp赋值给arr[low]。
返回此时的下标。递归的对arr[low]->arr[pos-1]以及arr[pos+1]->arr[high]进行快排。
2. 示例代码
package org.jinyuxin.sort.ExchangeSort;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {8,5,6,7,4,2,3,1};
int len = arr.length;
quickSort(arr, 0,len-1);
for(int i:arr) {
System.out.println(i);
}
}
public static void quickSort(int[] arr, int low, int high) {
if(low < high) {
int pos = findPosition(arr, low, high);
//递归对右半边进行快排
quickSort(arr,low,pos-1);
//对左半边进行快排
quickSort(arr,pos+1,high);
}
}
public static int findPosition(int[] arr, int low, int high) {
//枢纽值
int temp = arr[low];
//low等于high的时候退出循环
while(low < high) {
//从后向前,直到找到第一个小于temp的数才退出
while(low< high && arr[high] >= temp){
high--;
}
//找到小于枢纽值的数以后,赋值给arr[low]
arr[low] = arr[high];
//从前向后,直到找到第一个大于temp的数才退出
while(low < high &&arr[low] <= temp) {
low++;
}
//找到大于枢纽值的数以后,赋值给arr[high]
arr[high] = arr[low];
}
//此时将枢纽值赋值给low=high位置
arr[low] = temp;
//返回枢纽的最终位置
return low;
}
}