快速排序-Java版本

快速排序-Java版本

public static void quicksort(int begin, int end, int[] list) {
        if (begin < end) {
            int temp = 0;
            int left = begin, right = end;
            int k = begin;
            boolean turn = false;
            while (left < right) {
                if (!turn) {//turn为false时,从右向左
                    if (list[right] < list[k]) {
                        temp = list[k];
                        list[k] = list[right];
                        list[right] = temp;
                        k = right;
                        turn = !turn;
                        left++;
                    } else {
                        right--;
                    }
                } else {//turn为true时,从左向右
                    if (list[left] > list[k]) {
                        temp = list[k];
                        list[k] = list[left];
                        list[left] = temp;
                        k = left;
                        turn = !turn;
                        right--;
                    } else {
                        left++;
                    }
                }
            }
            quicksort(begin, k-1, list);
            quicksort(k+1, end, list);
        }
    }

通过leetcode测试结果如下(leetcode测试有随机性):
在这里插入图片描述
快排核心–通过选定一个基准值(基准值一般默认选择序列的第一个值),一次遍历使得基准值处于新序列”中心“(中心的意思时基准值左边的值全部小于等于基准值,右边的值全部大于等于基准值,再将原序列以基准值的位置(假定值为position)分割为【start,position-1】与【position+1,final】分别重复依据新的基准值遍历重新排序直至序列有序)

几个标记:

标记left记录从前往后寻找得暂停标志位,标记right从后往前寻找暂停标志位,标记key为基准值目前所在位置。从前往后未找到目标值依次left自加1,从前往后找到目标值交换后right自减1,从后往前未找到则right自减1,从后往前未找到则left自加1。
初始值: left=0,right=8,key=0

开始排序

例如下列序列(加黑斜体为基准值):
45 23 64 8 2 59 64 58 23

从序列最右边***right位置***开始找第一个小于45的值23与45交换位置,交换后此时,并且下一波寻找转向
left=1,right=8,key=8

第一次交换结果: 23 23 64 8 2 59 64 58 45

从序列最左边*** left位置***开始找第一个大于45的值64与45交换位置,并且下一波寻找转向,交换后此时
left=3,right=7,key=2

第二次交换结果: 23 23 45 8 2 59 64 58 64

从序列最右边***right位置***开始找第一个小于45的值2与45交换位置,并且下一波寻找转向,交换后此时
left=4,right=4,key=4

第三次交换结果: 23 23 2 8 45 59 64 58 64

从序列最右边***left位置***开始找第一个大于45的值与45交换位置,left到right之间并没有,至此***left==right***,第一遍历完成!

将序列以***45***分割陈两端【23 23 2 8】与【59 64 58 64】,每一段重复上述步骤并再分割直至每个子序列长度为2。

以上就是快排的一种思路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值