2021-07-08

快速排序算法Java实现

快速排序分以下几步走:
1.选择数组中第一个数作为基数

2.将小于基数的值放在数组左侧,大于基数的值放在右侧

3.对基数左右两边的数分别重复上面步骤,直到每个子集中只有一个数,即完全有序

将数组第一个数23赋给temp变量,指针 i 指向数组第一个元素,指针 j 指向数组最后一个元素
在这里插入图片描述

从 j 开始遍历(一定要先从右往左开始遍历),遇到13时,因为13<=temp,因此将arr[j]填入arr[i]中,即此时指针 i 指向的数为13;

在这里插入图片描述

再从 i 遍历(从左往右),遇到45时,因为45>temp,因此将arr[i]填入arr[j]中,此时指针 j 指向的数为45;

在这里插入图片描述

继续从 j 遍历,遇到11时,因为11<temp,因此将arr[j]填入arr[i]中,即此时指针 i 指向的数为11;

在这里插入图片描述

从 i 遍历,遇到89时,因为89>temp,因此将arr[i]填入arr[j]中,此时指针 j 指向的数为89;

在这里插入图片描述

从 j 遍历,遇到17时,因为17<temp,因此将arr[j]填入arr[i]中,即此时指针 i 指向的数为17;
在这里插入图片描述

从 i 遍历,遇到72时,因为72>temp,因此将arr[i]填入arr[j]中,此时指针 j 指向的数为72;

在这里插入图片描述

从 j 遍历,遇到3时,因为3<temp,因此将arr[j]填入arr[i]中,即此时指针 i 指向的数为3;

在这里插入图片描述

从 i 遍历,遇到26时,因为26>temp,因此将arr[i]填入arr[j]中,此时指针 j 指向的数为26;

在这里插入图片描述

从 j 遍历,和 i 重合;
在这里插入图片描述

当i=j时,将 temp(基准数23)填入arr[i]中。

在这里插入图片描述

此时完成算法的第2个步骤,接下来将23左边和右边的子区间分别用以上方法进行排序,直到区间只有一个元素即排序完成。

代码如下:

public class quickSort {
    public static void main(String[] args) {
        int[] array = {23,45,17,11,13,89,72,26,3,17,11,13};
        sort(array,0,array.length - 1);
        for (int i : array) {
            System.out.print(i+" ");
        }
    }

    public static void sort(int[] nums,int low,int high){
        if (low < high) {
            int i = low;
            int j = high;
            int pivot = nums[low];  // 第一个数作为基准数
            while (i < j) {
                // 一定要先从右向左
                while ((i < j) && (nums[j] >= pivot)) {
                    j--;
                }
                // 此时nums[j]小于pivot 换到前面
                nums[i] = nums[j];
                while ((i < j) && (nums[i] <= pivot)) {
                    i++;
                }
                // 此时nums[j]大于pivot 换到后面
                nums[j] = nums[i];
            }
            //将基准元素填入相应位置
            nums[i] = pivot;
            sort(nums,low,i - 1);
            sort(nums,i + 1,high);
        }
    }
}

图文参考链接:https://blog.csdn.net/elma_tww/article/details/86164674

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值