java 快速排序

目录

思想

过程图解

Java代码实现


思想

        快速排序是基于二分的思想,对冒泡排序的一种改进,主要思想是确立一个基数,将小于基数的数放到基数左边,大于基数的数字放到基数右边,然后再对这两部分进一步排序,从而实现对数组的排序,最后再使用递归。

过程图解

        

 首先有一个无序的数组,那么我们需要这么几个参数:left、right、key

  left,right两个指针,一个指向数组最左边,一个指向数组最右边

  还需要有一个关键点,key,一开始我们认为key就在数组最左边那个数字

  那么我们第一回合要做的事情,就是将比key大的数,全部放到key的右边;比key小的数,全部放在key的左边。

  ①我们从右边的指针开始移动,1比3小,那么右边的指针就停在了1的位置,我们移动left指针,找比3大的数,那么left指针就停留在5的位置

 并且left指针所指向的元素的下标不等于,右指针所指向的元素的下标位置,所以将两个指针所指向的元素交换位置。

 ②那么我们继续先移动右指针,找比3小的数字,所以右指针停留在了2的位置,同理,左指针停留在了9的位置。

 再将它们的值交换

 ③继续先移动右边的指针,寻找比3小的数字,但是会发现和左指针重合

 当两个指针重合的时候,我们需要将key元素和两个指针同时指向的元素进行交换。

 那么可以看到,比key小的数字都在左边,而比key大的数字都在右边。

④但是会发现,我们的整体排序并没有结束,只是完成了一轮排序,那么我们看

 左边的数组,和右边的数组继续使用这个方法,就可以完成排序,那么我们将使用递归的方法来完成。

Java代码实现

public class QuickSort {
   static int[] arr = new int[]{1,3,4,2,8,6,9};

    public static void main(String[] args) {
        quick(arr,0,arr.length-1);
        for(int i:arr){
            System.out.println(i);
        }
    }
    public static void quick(int[] arr,int left,int right){
        //如果数组为空或者长度为0,那么返回
        if(arr==null||arr.length == 0){
            return;
        }
        //如果左边的值大于右边,也返回
        if(left>right){
            return;
        }
        int key = arr[left];
        //这个地方就将left的值赋给l,这样的话就能保存住left的值
        int l=left;
        int r= right;
        //当l和r没有重合的时候
        while (l!=r){
            //右指针寻找小于key的值,注意判断l<r
            while (arr[r]>=key&&l<r){
                r--;
            }
            //左指针寻找大于key的值,注意判断l<r
            while (arr[l]<=key&&l<r){
                l++;
            }
            if(l<r){
                //交换两个指针对应元素的值
                int temp = arr[l];
                arr[l] = arr[r];
                arr[r] = temp;
            }
        }
        //交换key和两个指针重合时候的元素
        arr[left] = arr[r];
        arr[r] =key;
        quick(arr,left,l-1);
        quick(arr,l+1,right);

    }

quick(arr,left,l-1)的话,就是

 左边这个数组,最左边还是left,右边就是l-1

quick(arr,l+1,right)

 右边这个数组,最左边是l+1,最右边还是right

 对结果进行测试,发现已经排好序了~~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值