排序算法之快速排序

基本介绍

快速排序是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对两部分数据分别进行快速排序,整个排序过程可以递归进行,以达到整个数据变成有序序列。

案例分析

要求将数组[-9,78,0,23,-567,70]从小到大进行排序。
假设我们取数组中间一个数为参照,如以0为参照,步骤如下:
初始化左右指针0,5,选择(0+5)/2=2的下标值为0为参照,左边放比0小的,右边放比0大的,黑色指针此时-9和0比较,-9比0小,继续遍历,78比0大,暂停左边遍历,左指针指向78,此时右边指针开始遍历,70比0大,移动右指针,-567比0小,暂停右边遍历,进行交互数据,此时左指针指向下标为1的-567,右指针指向78,左右指针继续进行和0进行比较,0不比0小,暂停左遍历;右指针指向23,23比0大,继续遍历,右指针指向0,此时左右指针相等,一轮遍历结束。
在这里插入图片描述
一轮遍历进行分割数据,分割后为 -9,-567,0,23,78,70;然后在对0左边和右边的按照这种方式遍历;

代码实现

快速排序的代码是实现:

 /**
     * 快速排序
     * @param arr 数组
     * @param l 左指针初始值
     * @param r 右指针初始值
     */
 public static void quickSort(int[] arr,int l,int r){
        //中间值
        int point = arr[(l+r)/2];
        //左指针
        int left = l;
        //右指针
        int right = r;
        //临时值
        int temp;

        while (left < right) {

            //如果左边出现比中间值大,则退出此循环
            while (arr[left] < point){
                left++;
            }
            //如果右边出现比中间值小,则退出此循环
            while (arr[right] > point) {
                right--;
            }

            //如果left的值比right的值要大,则说明此时的值已是按照左边的值比中间值小,右边的值比中间值大
            //不需要进行后面的交换
            if (left >= right) {
                break;
            }

            //交换数据
            temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            //如果交换后,发现此时right所指向的值的和中间值相同,left要进行+1操作,避免数组中有重复数据进入死循环
            if (arr[right] == point) {
                left++;
            }

            if (arr[left] == point) {
                right--;
            }


        }
        //交换后继续进行遍历,如果当left和right值相等时,则left++;right--;
        if (left == right){
            left++;
            right--;
        }
		
        if (l < right) {
            quickSort(arr,l,right);
        }

        if (r > left) {
            quickSort(arr,left,r);
        }

    }

测试:

 public static void main(String[] args) {
        int[] arr = new int[]{-9,78,0,23,-567,70};
        quickSort(arr,0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

测试结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值