/**
* @ClassName QuickSort
* @Description 快速排序
* @Author shuai
* @Date 2018/7/18 13:21
* @Version 1.0
**/
public class QuickSort {
static boolean print = true;
static int j = 1;
public static void main(String[] args) {
int[] arr = {2, 4, 5, 7, 8, 9, 0, 3, 6, 1};
if(print){
System.out.print("【操作】\t");
for (int i = 0; i < arr.length; i++) {
System.out.print("【"+i+"】\t");
}
System.out.println();
System.out.print("原始数据\t");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t\t");
}
System.out.println();
}
quickSort(arr);
}
public static void quickSort(int[] arr) {
quickSort(arr, 0, arr.length - 1);
}
private static void quickSort(int[] arr, int low, int high) {
if (low < high) {
/*
* pivot是数组的一个脚标
* 以这个脚标为分割点,分成左右两个部分
* 可以理解为:
* 将每个子数组(数组的一段)的第一个元素的值取出来(partition方法是这么操作的)
* 放到合适的位置(调整数组数据位置,保证该元素前面的值比它小,后面的值比他大)
* 然后返回该元素的位置
*/
int pivot = partition(arr, low, high);
//递归排序左子数组
quickSort(arr, low, pivot - 1);
//递归排序右子数组
quickSort(arr, pivot + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
//枢轴记录
int pivotValue = arr[low];
System.out.println("======================================================================================");
System.out.println("当前操作的数组段,脚标:"+low+"->"+high+",将arr["+low+"]="+pivotValue+"设置为枢轴");
while (low < high) {
if(print){
System.out.println("low->"+low);
System.out.print("high->"+high);
}
while (low < high && arr[high] >= pivotValue) {
high--;
if(print){
System.out.print(","+high);
}
}
System.out.println();
//交换比枢轴小的记录到左端
arr[low] = arr[high];
if(print){
System.out.println("将high的值给low,arr["+high+"]->arr["+low+"]");
info(arr);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
System.out.print("low->"+low);
}
while (low < high && arr[low] <= pivotValue) {
low++;
if(print){
System.out.print(","+low);
}
}
System.out.println();
System.out.println("high->"+high);
//交换比枢轴小的记录到右端
arr[high] = arr[low];
if(print){
System.out.println("将low的值给high,arr["+low+"]->arr["+high+"]");
info(arr);
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
}
}
//找到枢轴的位置,并且赋值
arr[low] = pivotValue;
if(print){
System.out.println("找到枢轴的位置,此时low="+low+",high="+high+",将枢轴的值"+pivotValue+"赋给arr["+low+"]");
info(arr);
}
//返回的是枢轴的位置
return low;
}
public static void info(int[] arr){
System.out.print("【"+(j++)+"】\t\t");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+"\t\t");
}
System.out.println();
}
}
结果
【操作】 【0】 【1】 【2】 【3】 【4】 【5】 【6】 【7】 【8】 【9】
原始数据 2 4 5 7 8 9 0 3 6 1
======================================================================================
当前操作的数组段,脚标:0->9,将arr[0]=2设置为枢轴
low->0
high->9
将high的值给low,arr[9]->arr[0]
【1】 1 4 5 7 8 9 0 3 6 1
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->0,1
high->9
将low的值给high,arr[1]->arr[9]
【2】 1 4 5 7 8 9 0 3 6 4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->1
high->9,8,7,6
将high的值给low,arr[6]->arr[1]
【3】 1 0 5 7 8 9 0 3 6 4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->1,2
high->6
将low的值给high,arr[2]->arr[6]
【4】 1 0 5 7 8 9 5 3 6 4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->2
high->6,5,4,3,2
将high的值给low,arr[2]->arr[2]
【5】 1 0 5 7 8 9 5 3 6 4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->2
high->2
将low的值给high,arr[2]->arr[2]
【6】 1 0 5 7 8 9 5 3 6 4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=2,high=2,将枢轴的值2赋给arr[2]
【7】 1 0 2 7 8 9 5 3 6 4
======================================================================================
当前操作的数组段,脚标:0->1,将arr[0]=1设置为枢轴
low->0
high->1
将high的值给low,arr[1]->arr[0]
【8】 0 0 2 7 8 9 5 3 6 4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->0,1
high->1
将low的值给high,arr[1]->arr[1]
【9】 0 0 2 7 8 9 5 3 6 4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=1,high=1,将枢轴的值1赋给arr[1]
【10】 0 1 2 7 8 9 5 3 6 4
======================================================================================
当前操作的数组段,脚标:3->9,将arr[3]=7设置为枢轴
low->3
high->9
将high的值给low,arr[9]->arr[3]
【11】 0 1 2 4 8 9 5 3 6 4
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->3,4
high->9
将low的值给high,arr[4]->arr[9]
【12】 0 1 2 4 8 9 5 3 6 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->4
high->9,8
将high的值给low,arr[8]->arr[4]
【13】 0 1 2 4 6 9 5 3 6 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->4,5
high->8
将low的值给high,arr[5]->arr[8]
【14】 0 1 2 4 6 9 5 3 9 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->5
high->8,7
将high的值给low,arr[7]->arr[5]
【15】 0 1 2 4 6 3 5 3 9 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->5,6,7
high->7
将low的值给high,arr[7]->arr[7]
【16】 0 1 2 4 6 3 5 3 9 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=7,high=7,将枢轴的值7赋给arr[7]
【17】 0 1 2 4 6 3 5 7 9 8
======================================================================================
当前操作的数组段,脚标:3->6,将arr[3]=4设置为枢轴
low->3
high->6,5
将high的值给low,arr[5]->arr[3]
【18】 0 1 2 3 6 3 5 7 9 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->3,4
high->5
将low的值给high,arr[4]->arr[5]
【19】 0 1 2 3 6 6 5 7 9 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->4
high->5,4
将high的值给low,arr[4]->arr[4]
【20】 0 1 2 3 6 6 5 7 9 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->4
high->4
将low的值给high,arr[4]->arr[4]
【21】 0 1 2 3 6 6 5 7 9 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=4,high=4,将枢轴的值4赋给arr[4]
【22】 0 1 2 3 4 6 5 7 9 8
======================================================================================
当前操作的数组段,脚标:5->6,将arr[5]=6设置为枢轴
low->5
high->6
将high的值给low,arr[6]->arr[5]
【23】 0 1 2 3 4 5 5 7 9 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->5,6
high->6
将low的值给high,arr[6]->arr[6]
【24】 0 1 2 3 4 5 5 7 9 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=6,high=6,将枢轴的值6赋给arr[6]
【25】 0 1 2 3 4 5 6 7 9 8
======================================================================================
当前操作的数组段,脚标:8->9,将arr[8]=9设置为枢轴
low->8
high->9
将high的值给low,arr[9]->arr[8]
【26】 0 1 2 3 4 5 6 7 8 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->8,9
high->9
将low的值给high,arr[9]->arr[9]
【27】 0 1 2 3 4 5 6 7 8 8
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=9,high=9,将枢轴的值9赋给arr[9]
【28】 0 1 2 3 4 5 6 7 8 9