简简单单!!快速排序及其思路(Java)

1.快速排序的简单介绍

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

2.快速排序思路示意图

快速排序思路流程示意图

3.本文代码的思路

  • 确定标准值temp(本文的标准值为数组的第一个元素),左指针left(用i的变化表示移动)和右指针right(用j的变化表示移动).
  • 设置大循环(条件为i<j),大循环内设置两个小循环,一个循环代表右指针right的移动(从arr.length-1开始用j表示),一个循环代表左指针left的移动(从0开始用i表示), 如果当前索引值代表的元素值小于标准值并且i<j,i指针就往右移(循环,不用交换);同理,i<j,j右指针往左移(循环).
  • 当在i右移,j左移并且i和j不相等没遇到时,如果发现i指针代表元素值大于标准值;同理,j指针代表元素值小于标准值,那么两个循环停止,如果当前循环遍历到的值i<j,那么就要交换值(即arr[i]<=>arr[j] )之后一直循环,直到当i==j,那么代表这一轮循环结束了.
  • 开始重新定义left和right和标准值(即arr[left]=arr[i] ,arr[i]=temp(标准值),就是标准值temp真的往中间放(这里中间的定义是i==j的地方), 把原来在这个位置的元素放到arr[0]中去当做标准值),在开始分左边和右边的数组进行递归(即左数组quickSort(arr,0,i-1), 右数组 quickSort(arr,i+1,arr.length-1)),一直到左数组和右数组中需要排序的元素只有一个(即left<=right),那么整个排序结束.

4.代码

package Sort;
import java.util.Arrays;
/**
 * @author zh
 * @ClassName : Sort.QuickSort
 * @Description :快速排序
 * Created by user on 2021-07-20 20:17:25
 * Copyright  2020 user. All rights reserved.
 */
public class QuickSort {
   static int[] arr;
   /**
    * 快速排序
    * @author zh
    * @date 2021/7/20 20:18
    * @param arr:数组
    * @param left:左边索引(0开始)
    * @param right:右边索引(arr.length-1开始)
    **/
      public static void quickSort(int[] arr,int left,int right) 
          /*当left>=right说明该数组只剩一个元素了,没必要排序,排序结束*/
          if (left>=right){
              return;
          }
       /*存储左边索引*/
        int i=left;
        /*存储右边索引*/
        int j=right;
        /*存储标准比较值,每次都是最左边的元素*/
        int  temp = arr[left];
        while (i<j){
            /*右边进行遍历,当i<j并且当前索引值比标准值大,j指针左移*/
          while (i<j&&arr[j]>=temp){
              j--;
          }
            /*左边开始遍历,当i<j并且当前索引值比标准值小,i指针右移*/
          while (i<j&&arr[i]<=temp){
              i++;
          }
            /*当程序走到这里并且i<j时,说明上面的两个循环各自有一个索引值不满足条件,导致循环终止,
            那么这时候就可以将两个值进行交换*/
          if (i<j){
              /*这里由于不想再定义一个临时变量,所以用位运算^异或运算进行交换值*/
              arr[i]=arr[i]^arr[j];
              arr[j]=arr[i]^arr[j];
              arr[i]=arr[i]^arr[j];
          }
        }
        /*最后将原来的标准值和当前的i==j索引值进行交换,让arr[i]不进行下一轮的排序*/
          arr[left]=arr[i];
          arr[i]=temp;
          /*进行递归排序左数组*/
          quickSort(arr,left,i-1);
          /*进行递归排序右数组*/
          quickSort(arr,i+1,right);
      }

    public static void main(String[] args) {
          arr=new int[10];
        for (int i = 0; i < 10; i++) {
            arr[i]= (int) (Math.random()*10+1);
        }
        System.out.println("排序前数组"+Arrays.toString(arr));
        quickSort(arr,0,arr.length-1);
        System.out.println("排序后数组"+Arrays.toString(arr));
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值