【Java面试题】快排原理分析

写在前面

       在面试中,经常会被问到 Java 中的一些经典排序,尤以快排为最。在 Java 中的经典排序有如下常用的几种:1.冒泡排序 2.快速排序(快排) 3.插入排序 4.归并排序 5.选择排序 6.希尔排序 7.堆排序 8.基数排序,本文我们就来简单分析一下快排的原理

概念介绍

       快排,又称快速排序(Quicksort)。是对冒泡排序的一种改进。快速排序由 C. A. R. Hoare在 1960 年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快排基本思想

  1. 先从数组中取出一个数作为基准数。
  2. 分区过程。将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
  3. 再对左右区间重复第二步、第三步…直到各区间只有一个数。

时间复杂度

冒 泡 排 序 时 间 复 杂 度 为 : O ( n 2 ) 冒泡排序时间复杂度为:O(n^2) O(n2)

快 排 时 间 复 杂 度 为 : O ( n l o g 2 n ) 快排时间复杂度为:O(nlog_{2}n) O(nlog2n)

原理分析:

       接下来,我们通过数组[58,36,89,24,16,25,68,38,62,49,85,34],来进行快排原理分析
在这里插入图片描述

代码实现:

import java.util.Arrays;

/**
 * TODO 快排实现
 *
 * @author liuzebiao
 * @Date 2020-4-21 10:43
 */
public class QuickSort {

    public static void main(String[] args) {
        int[] arr = {58,36,89,24,16,25,68,38,62,49,85,34};
        String s = Arrays.toString(quickSort(arr, 0, arr.length - 1));
        System.out.println(s);
    }

    /**
     * 快排
     *
     * @return
     */
    public static int[] quickSort(int[] arr,int left,int right) {
        if(left<right) {
            //左
            int i = left;
            //右
            int j = right;
            //获取基准数
            int key = arr[i];
            while (i < j) {
                while (arr[j] >= key && i < j) {
                    j--;
                }
                if (i < j) {
                    arr[i] = arr[j];
                }
                while (arr[i] <= key && i < j) {
                    i++;
                }
                if (i < j) {
                    arr[j] = arr[i];
                }
            }
            arr[i] = key;
            //左段递归排序
            quickSort(arr, 0, i - 1);
            //有段递归排序
            quickSort(arr, i + 1, right);
        }
        return arr;
    }
}

排序结果:[16, 24, 25, 34, 36, 38, 49, 58, 62, 68, 85, 89]

快速排序还有很多改进版本,如随机选择基准数以中间的数作为基准数等。不过原理都是类似的。有兴趣的可以自己去研究一下。


博主写作不易,来个关注呗

求关注、求点赞,加个关注不迷路 ヾ(◍°∇°◍)ノ゙

博主不能保证写的所有知识点都正确,但是能保证纯手敲,错误也请指出,望轻喷 Thanks♪(・ω・)ノ

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扛麻袋的少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值