欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

面试必问---快排原理分析

程序员文章站 2024-03-05 18:57:49
...

写在前面

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

概念介绍

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

快排基本思想:

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

原理分析:

       接下来,我们通过数组[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]

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


面试必问—快排原理分析,介绍到此为止

如果本文对你有所帮助,那就给我点个赞,来个关注吧,谢谢

End

相关标签: 基础专栏