• 快速排序


    一.概念

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

    二.排序分析

          快速排序的基本思想:

                1、先从数列中取出一个数作为基准数。

                2、从两端开始“探测”。先从右往左找一个小于基准数的数,再从左往右找一个大于基准数的数,然后交换他们,然后继续探测。

                3、当左右下标重合的时候,交换基准数和当前下标数,比如当前左右下标相等的数为k,则相当于把数列进行分区,左分区为[0,k-1],右分区为[k+1,n]。

                4、重复上面的过程,完成排序。

            待排序数组 :  

           第一步:以最右边的6为基准点

          

           第二步:从左边开始找比6大的数,很显然是8

        

           第三步:从右边开始找比6小的数,很明显是4

        

           第四步:交换8和4的位子

         

     

           第五步:继续开始从左边找比6大的数,找到9

        

           第六步:从右边开始找比6小的数,当左右下标重合时

         

           第七步:交换重合位子数值和基准数的位子

        

           第八步:两个分区重复上面的过程,直到结束

        

    三.时间复杂度和空间复杂度

            快速排序的平均时间复杂度也是:O(nlogn),空间复杂度O(logn)。

    四.快速排序动图

    五.Java代码实现

    /**
     * 快速排序
     */
    public class QuickSort {
        public static void main(String[] args) {
            int[] arrays = {4,7,6,5,3,2,8,1,9};
            int length = arrays.length;
            new QuickSort().quickSort(arrays,0,length-1);
            for (int array : arrays) {
                System.out.println(array);
            }
        }
    
        public void quickSort(int[] array, int start, int end) {
            if(start >= end){
                return;
            }
            int index = getIndex(array, start, end);
             quickSort(array, start, index-1);
            quickSort(array, index + 1, end);
        }
    
        private int getIndex(int[] array, int start, int end) {
            int temp;
            int pivot = start;
            int i = start;
            int j = end;
            while (i != j) {
                if (array[j] > array[pivot]) {
                   j--;
                } else {
                    if (array[i] <= array[pivot]) {
                       i++;
                    } else {
                        temp = array[i];
                        array[i] = array[j];
                        array[j] = temp;
                        j--;
                    }
                }
            }
            temp = array[i];
            array[i] = array[pivot];
            array[pivot] = temp;
            return i;
        }
    }

    附录:算法动态图:https://www.cs.usfca.edu/~galles/visualization/

  • 相关阅读:
    求解大于或等于某个4字节正整数的最小2次幂
    C++17 std::optional
    C++主动调用析构函数
    std::raise()
    C++ std::integral_constant
    C++ range-v3库的安装与测试[Utunbu 18.04]
    python将YUV420P文件转PNG图片格式
    python将两张图片横向或者纵向合成一张
    folly库之Benchmark.h
    Facebook的folly库在Utunbu上的编译
  • 原文地址:https://www.cnblogs.com/dyg0826/p/11372571.html
Copyright © 2020-2023  润新知