快速排序算法--这么有价值的东西不了解一下?

概述

  • 通俗易懂版:有一个数组,数组的第一位设为基准为,所有比基准位小的都置于左侧(这里默认升序),所有比基准位大的置于右侧,此时原来的基准为现在就在数组中间,这样第一轮排序完成,这时将基准位的两侧都当初新的数组,重复执行上面的操作,每一个新数组都会分成两个新数组,一直执行下去,直到只剩一位,不能在分时,代表,排序完成,return!
  • 那么怎么来完成以上要求呢?现在来分布执行一下步骤:
  • 先定义个一个变量tmp,保存一下基准位
  • 现在需要一个while循环,从数组的最后一位开始跟基准位比较,如果比基准小,那么我们将改值传递至基准位,此时该whie循环结束
  • 现在还需要一个while循环,将从数组的第二位开始与基准为比较,如果比基准位大,将值传递至上一个循环结束的位置,此时该循环结束
  • 现在我们要重复上面两步的操作,直到,两个循环的下标相等,即结束
  • 因为两个下标已相等,此时就将基准位传入该位置,此时左都比基准位小,右侧都比基准大,那么该轮循环确定了基准位应该所在的位置
  • 接下来将左右两次当成新数组,继续执行以上步骤,这里就用到了递归调用

实现方法

import java.util.Arrays;
import java.util.Random;

/**
 * @ Author: Zhangyu
 * @ Date: 2020/7/29
 * @ Description:
 */
public class QuickSort2 {
    public static void quick(int[] a,int start,int end) {
        int i=start,j=end;//保存数组的起始与末尾的值,用于后面递归调用
        if (i>=j)return;//当差分到最小数组时,说明已有序了
        int tmp=a[start];//保存数组基准位
        
        while (i<j){
            while (a[j]>=tmp&&i<j) j--;//从后往前找比基准位小的值,并且不能i与j不能重合
            a[i]=a[j];
            while (a[i]<=tmp&&i<j) i++;//从前往前找比基准位大的值,并且不能i与j不能重合
            a[j]=a[i];
        }

        a[i]=tmp;//该轮循环结束,将基准位插入i与j重叠的位置
        
        quick(a,start,i-1);//将基准位右侧当成新的数组进行递归调用
        quick(a,i+1,end);//将基准左侧当成新的数组进行递归调用

    }

    public static int[] randomArrays(int length){//生产100以内的随机数
        int[] a=new int[length];
        for (int i = 0; i < a.length; i++) {
            Random r=new Random();
            a[i]=r.nextInt(100);
        }
        return a;

    }

    public static void main(String[] args) {
        int[] a=randomArrays(10);//生产10个数的数组
        System.out.println(Arrays.toString(a));//输出数组所有内容
        quick(a,0,a.length-1);//快速排序
        System.out.println(Arrays.toString(a));//再次输出
    }

}

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页