java实现快速排序

java实现快速排序

题目

快速排序是冒泡排序的一种改进。其基本思想是: 通过一次行程排序将排序数据拆分为单独的两部分,其中一部分的所有数据都小于另一部分的所有数据,然后对这两部分的数据分别按照快速排序的方法进行排序,整个排序过程可以递归,实现将整个数据分成有序的序列。

基本思想

基本思路

详细思路

首先,一般我们设定pivot为最左边的元素
设定两个循环指针,一个为数组左边,一个数组最右边

  1. 循环找比标准数大的数和比标准数小的数 此时用左右两个指针来判断
  2. 在大循环里面我们先从右边循环开始,如果右边的数arr[r]≥pivot,则右指针向前移动。直到不符合条件为止,即出现右边的数字比pivot小,退出循环。
  3. 将arr[l] = arr[r];
  4. 右边的数替换为左边以后,然后开始操作左指针,当左边arr[l] <= pivot时,左指针一直向后移动,直到不符合条件为止,即出现左边的数比pivot大,退出循环。
  5. arr[r] = arr[l];
  6. 一直循环操作上述2-5步骤,直到左指针与右指针重合,退出循环
  7. 此时重合之处,就是pivot所在位置。arr[l] =pivot;
  8. 然后分别向左向右再次递归,直到变成有序数组。注意向左递归时,左变量不变,右变量变为重合处。右递规时,右边量不变,左变量变为重合处+1.

第一遍思路图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

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

    public static void quickSort(int[] arr, int left, int right) {
        if(left < right) {
            //把数组中的第0个数字作为标准数
            int pivot = arr[left];
            //需要记录的排序坐标
            int l = left;
            int r = right;
            //循环找比标准数大的数和比标准数小的数
            while (l < r) {

                //右边的数字比标准数更大
                while (l<r && arr[r] >= pivot) {
                    r--;//下标前移
                }
                
                //将右边的数字替换左边的数字
                arr[l] = arr[r];
                
                //左边的数字比标准数更小
                while (l<r && arr[l] <= pivot) {
                    l++;//下标前移
                }
                
                //将右边的数字替换左边的数字
                arr[r] = arr[l];
                
            }
            //把标准数赋予下标相等的地方
            if(l >= r){
                arr[l] =pivot;
            }

            //向左向右递归
            quickSort(arr,left,l);
            quickSort(arr,l+1,right);
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值