Java中的十大排序(七)快速排序

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」。

前言

年前给大家讲解了排序的一些相关参数,以及部分排序进行了初步认识。本章为大家讲述一下快速排序,快速排序是经典程序员入门的一种排序,快排非常简单,其思路有点类似希尔那种,但是没有希尔的大数据量快。

image.png

快速排序分析

时间复杂度平均为 O(log 下标^2 n) 时间复杂度最坏为 O(n^2) 时间复杂度最好为 O(log 下标^2 n) 空间复杂度O(log 下标^2 n) 稳定性为不稳定

通过上面参数可以看出快速排序相较于其他的排序来说在空间复度上面有着不小的占有,但是他的平均速度非常的可观,由于本身特性的原因导致稳定性差。

快速排序的思路

快速排序最重要的一点便是基准数这个东西,基准数一般选泽数组的最左边开始的元素,在速度上快速排序选择了双指针的思想,从数组两端开始检索,假设左指针开始动找到比基准数大的就停下来记录该位置与值,然后右指针开始动找到比基准数小的然后停下来记录该位置与值,随后进行交换,如果直到指针重合都没找到,那就把基准数放入指针位置,这样是为了营造出基准数左边是小与基准数的,而基准数右边是大于基准数的。依次类推直到最后排序完毕。

定义一个数组
// private static int[] arr = {6, 5, 3, 2, 4};
使用一个例子来大家理解一下

基准数为 6
5 3 2 4 6 //左指针遍历完了发现没有比他大的,6固定住
转为排序 5 3 2 4 基准数为 5
3 2 4 5 //遍历完发现5也没有比他大,5固定
转为排序 3 2 4 基准数为3
2 3 4 //左指针发现2然后停下,到右指针行动,发现2停下,因为重合交换基准数
最后整合 2 3 4 5 6

复制代码

快速排序代码


@Test
public void testQKsort(){
  QKsort(arr, 0,arr.length - 1);
  System.out.println(getArr(arr));
}

public void QKsort(int[] arrQK, int left, int right) {
  if(left > right)
    return;
  int base = arrQK[left];
  int i = left;
  int j = right;
  while (i != j){
    while (arrQK[j] >= base && j > i){
      j--;
    }
    while (arrQK[i] <= base && j > i){
      i++;
    }
    if (j > i) {
      int temp  = arrQK[i];
      arrQK[i] = arrQK[j];
      arrQK[j] = temp;
    }
  }
  arrQK[left] = arrQK[i];
  arrQK[i] = base;
  QKsort(arrQK, left, i - 1);
  QKsort(arrQK,i + 1, right);
}
复制代码

Guess you like

Origin juejin.im/post/7068634553404882958