快速排序

简介: 快速排序

最近做题,发现冒泡和选择排序的复杂度太大了,容易超时,于是就学习了快排

快排:简单地说就是找到一个基准数字m,数组中比m大的放在右边,比m小的放在左边,这样m的位置是正确的的。然后利用递归再分别对两边进行快排

下面我逐步讲解一下快排的思路:

1.假定对数组{6,1,7,5,3,11}进行快排

2.首先在这个序列中找一个数作为基准数,为了方便可以取第一个数6

3.进行初步快排之后,变成{5,1,3,6,7,11}

4.这是如何做到的呢,取6为基准

5.从数组最右向左边遍历找到一个比6小的数字,记为j

6.同理:遍历数组左边,找到比6大的数字,记为i

7.然后交换i和j所在位置的数字,然后继续检索

8.直到i= =j,表示本次检索已经结束,讲i与基准数字换位。此时基准数字已经找到自己的位置了

9.然后把数组根据基准数=左右分成两部分,利用递归再进行排序

就像:

原数组 :6,1,7,5,3,11---------key:6

第一次交换:6,1,3,5,7,11------3和7进行交换

第二次交换:5,1,3,6,7,11-------此时i==j

那么如果第四个数字5换成8会怎么样?当初我就感觉如果这样还要再加一个判断,思考一下,问题会在最后揭晓

接下来先上代码:`

import java.sql.Array;
import java.util.Arrays;
public class test1 {
  public static void main(String[] args) {
    int [] arr= {6,1,8,7,5,2,3,11};
    System.out.println(Arrays.toString(arr));
    quickSort(arr,0,arr.length-1);
    System.out.println(Arrays.toString(arr));
  }
  private static void quickSort(int[] arr, int left, int right) {
    if(left>=right) return;//如果边界相等,就直接结束循环了
    int key=arr[left];
    int i=left;
    int j=right;
    while(i<j) {
      while(i<j&&arr[j]>=key) {//遇到比key大的数字,向左检索
        j--;
      }
      while(i<j&&arr[i]<=key) {//从左开始,遇到比key小的数字,向右检索
        i++;
      }
      if(i<j) {
        int temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
      }
    }
    //此时i==j
    arr[left]=arr[i];
    arr[i]=key; 
    quickSort(arr, left, i-1);
    quickSort(arr, i+1, right);
    }
}

如果把5换成8,那么程序在执行下面这个语句是while(i<j&&arr[j]<key) {//遇到比key大的数字,向左检索 j--; }

因为满足条件,会自动向左在移动一位。我当时查资料的时候就一直迷在这里,以为还要再加一个判断

相关文章
|
7月前
快速排序(超超详细,因为自己也不是很会)
快速排序(超超详细,因为自己也不是很会)
|
3天前
快速排序
快速排序
8 0
|
3天前
|
搜索推荐 C++
C++快速排序的实现
C++快速排序的实现
|
3天前
|
算法
快速排序(三)——hoare法
快速排序(三)——hoare法
34 1
|
5月前
|
C++
C++快速排序
C++快速排序
40 1
|
9月前
|
算法 搜索推荐 测试技术
快速排序详解
快速排序详解
47 0
|
11月前
重新理解快速排序
重新理解快速排序
40 0
|
12月前
快速排序实现
快速排序实现
45 0
|
12月前
|
机器学习/深度学习
785. 快速排序
785. 快速排序
44 0