快速排序

/**
 * @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]
【11       4       5       7       8       9       0       3       6       1       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->01
high->9
将low的值给high,arr[1]->arr[9]
【21       4       5       7       8       9       0       3       6       4       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->1
high->9876
将high的值给low,arr[6]->arr[1]
【31       0       5       7       8       9       0       3       6       4       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->12
high->6
将low的值给high,arr[2]->arr[6]
【41       0       5       7       8       9       5       3       6       4       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->2
high->65432
将high的值给low,arr[2]->arr[2]
【51       0       5       7       8       9       5       3       6       4       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->2
high->2
将low的值给high,arr[2]->arr[2]
【61       0       5       7       8       9       5       3       6       4       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=2,high=2,将枢轴的值2赋给arr[2]
【71       0       2       7       8       9       5       3       6       4       
======================================================================================
当前操作的数组段,脚标:0->1,将arr[0]=1设置为枢轴
low->0
high->1
将high的值给low,arr[1]->arr[0]
【80       0       2       7       8       9       5       3       6       4       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->01
high->1
将low的值给high,arr[1]->arr[1]
【90       0       2       7       8       9       5       3       6       4       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=1,high=1,将枢轴的值1赋给arr[1]
【100       1       2       7       8       9       5       3       6       4       
======================================================================================
当前操作的数组段,脚标:3->9,将arr[3]=7设置为枢轴
low->3
high->9
将high的值给low,arr[9]->arr[3]
【110       1       2       4       8       9       5       3       6       4       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->34
high->9
将low的值给high,arr[4]->arr[9]
【120       1       2       4       8       9       5       3       6       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->4
high->98
将high的值给low,arr[8]->arr[4]
【130       1       2       4       6       9       5       3       6       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->45
high->8
将low的值给high,arr[5]->arr[8]
【140       1       2       4       6       9       5       3       9       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->5
high->87
将high的值给low,arr[7]->arr[5]
【150       1       2       4       6       3       5       3       9       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->567
high->7
将low的值给high,arr[7]->arr[7]
【160       1       2       4       6       3       5       3       9       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=7,high=7,将枢轴的值7赋给arr[7]
【170       1       2       4       6       3       5       7       9       8       
======================================================================================
当前操作的数组段,脚标:3->6,将arr[3]=4设置为枢轴
low->3
high->65
将high的值给low,arr[5]->arr[3]
【180       1       2       3       6       3       5       7       9       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->34
high->5
将low的值给high,arr[4]->arr[5]
【190       1       2       3       6       6       5       7       9       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->4
high->54
将high的值给low,arr[4]->arr[4]
【200       1       2       3       6       6       5       7       9       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->4
high->4
将low的值给high,arr[4]->arr[4]
【210       1       2       3       6       6       5       7       9       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=4,high=4,将枢轴的值4赋给arr[4]
【220       1       2       3       4       6       5       7       9       8       
======================================================================================
当前操作的数组段,脚标:5->6,将arr[5]=6设置为枢轴
low->5
high->6
将high的值给low,arr[6]->arr[5]
【230       1       2       3       4       5       5       7       9       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->56
high->6
将low的值给high,arr[6]->arr[6]
【240       1       2       3       4       5       5       7       9       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=6,high=6,将枢轴的值6赋给arr[6]
【250       1       2       3       4       5       6       7       9       8       
======================================================================================
当前操作的数组段,脚标:8->9,将arr[8]=9设置为枢轴
low->8
high->9
将high的值给low,arr[9]->arr[8]
【260       1       2       3       4       5       6       7       8       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
low->89
high->9
将low的值给high,arr[9]->arr[9]
【270       1       2       3       4       5       6       7       8       8       
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
找到枢轴的位置,此时low=9,high=9,将枢轴的值9赋给arr[9]
【280       1       2       3       4       5       6       7       8       9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值