经典排序算法之快速排序详解

Posted Dream_it_possible!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典排序算法之快速排序详解相关的知识,希望对你有一定的参考价值。

前言

         什么是快速排序?  这是我之前遇到的一个面试题,当时没回答来,我只写过冒泡排序、选择排序、插入排序呀,啥是快速排序,委屈巴巴, 一首凉凉送我自己。 

1. 什么是快速排序算法?

        快速排序算法是对冒泡排序算法的一种改进,没有冒泡排序两两相邻之间的比较换位,主要采用的思想是通过递归+独立排序的形式将无序的数列进行分割成可以独立排序的2部分数列,其中一部分数列比另外一部书数列小,每次排序两个独立的数列,直到排序完毕,即可完成最终的排序。

       

2. 快速排序的原理

        1) 从左边定义一个i =0,右边定义一个j= arr.length-1 , 定义第一个分界值为 a[0], i++ ,直到找到第一个比a[i]大的值,然后a[i]与a[j] 互换位置。

        2)  从右边定义一个j,  j--, 找到比第一个比a[0]小的值a[j]与a[i]互换位置。

        3) 如果循环的i-1>start 或 j+1>end, 那么重复步骤1 ) 2) ,直到 i==j,循环结束, 排序完毕。

3. 代码实现

    

package sort;

import java.util.Arrays;

public class QuickSort {


    public static void main(String[] args) {
        int[] a = new int[10];
        a[0] = 46;
        a[1] = 38;
        a[2] = 67;
        a[3] = 79;
        a[4] = 15;
        a[5] = 16;
        a[6] = 5;
        a[7] = 56;
        a[8] = 47;
        a[9] = 13;
        System.out.println(Arrays.toString(a));
        int start = 0;
        int end = a.length - 1;
        int[] result = quickSort(a, start, end);
        System.out.println(Arrays.toString(result));
    }


    public static int[] quickSort(int[] params, int start, int end) {
        int v = params[start];
        int i = start;
        int j = end;
        while (i < j) {
            //从小到大排序
            while ((i < j) && params[j] > v) {
                j--;
            }
            while ((i < j) && params[i] < v) {
                i++;
            }
            if ((params[i] == params[j]) && (i < j)) {
                i++;
            } else {
                if (i != j) {
                    swap(i, j, params);
                    System.out.println("结果为:" + Arrays.toString(params));
                }
            }
            if (i - 1 > start) {
                params = quickSort(params, start, i - 1);
            }
            if (j + 1 < end) {
                params = quickSort(params, j + 1, end);
            }
        }
        return params;
    }


    public static void swap(int index1, int index2, int[] arr) {
        int temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }
}

打印结果:

[46, 38, 67, 79, 15, 16, 5, 56, 47, 13]
结果为:[13, 38, 67, 79, 15, 16, 5, 56, 47, 46]
结果为:[13, 38, 46, 79, 15, 16, 5, 56, 47, 67]
结果为:[13, 38, 5, 79, 15, 16, 46, 56, 47, 67]
结果为:[13, 38, 5, 79, 15, 16, 46, 47, 56, 67]
结果为:[13, 38, 5, 46, 15, 16, 79, 47, 56, 67]
结果为:[5, 38, 13, 46, 15, 16, 79, 47, 56, 67]
结果为:[5, 13, 38, 46, 15, 16, 79, 47, 56, 67]
结果为:[5, 13, 38, 16, 15, 46, 79, 47, 56, 67]
结果为:[5, 13, 38, 16, 15, 46, 67, 47, 56, 79]
结果为:[5, 13, 38, 16, 15, 46, 56, 47, 67, 79]
结果为:[5, 13, 38, 16, 15, 46, 47, 56, 67, 79]
结果为:[5, 13, 15, 16, 38, 46, 47, 56, 67, 79]
[5, 13, 15, 16, 38, 46, 47, 56, 67, 79]

由打印结果可知,快速排序的效率是非常高的, 单次排序即可挪动两边数据进行大小比较。

以上是关于经典排序算法之快速排序详解的主要内容,如果未能解决你的问题,请参考以下文章

经典排序算法和python详解:归并排序快速排序堆排序计数排序桶排序和基数排序

三大经典排序算法之最经典之快速排序

经典排序算法和Python详解之选择排序和二元选择排序

经典算法之快速排序

经典排序算法之快速排序

经典排序算法之——06 快速排序