美文网首页
快速排序

快速排序

作者: ZhouHaoIsMe | 来源:发表于2020-05-13 15:44 被阅读0次

快速排序(Quick Sort) O(nlog2(n))

介绍

快速排序的基本思想:首先在序列中选择一个基准数(常用第一个作为基准),接下来将整个序列以基准数为分割点将序列分成独立的两部分,一边小一边大,接着继续对独立部分进行同样的操作。

算法描述

  • 从序列中选择一个数作为基准,"pivot"
  • 重新排列序列,将小于基准的数值放在左边,大于基准的数据放在右边,该基准值置于二者分割位置,该操作成为分区操作 "partition"。
  • 递归(recusive)将两个独立分区进行同样的操作。

稳定性

不稳定,因为在排序得过程当中进行了数值位置交换,相同的值相对位置有可能发生改变

动图展示

quickSort.gif

代码实现

ps:动态展示代码实现核心方法使用partition。partition1是另一种两边向中间靠进行分区的算法。

public class QuickSort {
    public static void main(String[] args) {
        int[] arrays = new int[]{27, 6, 27, 42, 23, 15, 38, 50, 35, 14, 40, 28};
        int[] res = quickSort(arrays, 0, arrays.length - 1);
        print(res);
    }

    public static int[] quickSort(int[] arr, int minIdx, int maxIdx) {
        print(arr);
        int partition = partition(arr, minIdx, maxIdx);
        if (minIdx < maxIdx) {
            quickSort(arr, minIdx, partition - 1);
            quickSort(arr, partition + 1, maxIdx);
        }
        return arr;
    }

    /**
     * 27   6   27  42  23  15  38  50  35  14  40  28
     * 14   6   23  15  27  42  38  50  35  27  40  28
     * 6    14  23  15  27  42  38  50  35  27  40  28
     * 6    14  23  15  27  42  38  50  35  27  40  28
     * 6    14  15  23  27  42  38  50  35  27  40  28
     * 6    14  15  23  27  42  38  50  35  27  40  28
     * 6    14  15  23  27  42  38  50  35  27  40  28
     * 6    14  15  23  27  28  38  35  27  40  42  50
     * 6    14  15  23  27  27  28  35  38  40  42  50
     * 6    14  15  23  27  27  28  35  38  40  42  50
     * 6    14  15  23  27  27  28  35  38  40  42  50
     * 6    14  15  23  27  27  28  35  38  40  42  50
     * 6    14  15  23  27  27  28  35  38  40  42  50
     * 6    14  15  23  27  27  28  35  38  40  42  50
     * 6    14  15  23  27  27  28  35  38  40  42  50
     * 6    14  15  23  27  27  28  35  38  40  42  50
     */
    public static int partition(int[] arr, int minIdx, int maxIdx) {
        int pivotIdx = minIdx;
        int idx = pivotIdx + 1;
        for (int i = minIdx; i <= maxIdx; i++) {
            if (arr[i] < arr[pivotIdx]) {
                swap(arr, i, idx);
                idx++;
            }
        }
        idx--;
        swap(arr, idx, pivotIdx);
        return idx;
    }

    /**
     * 27   6   27  42  23  15  38  50  35  14  40  28
     * 6    14  27  42  23  15  38  50  35  27  40  28
     * 6    14  27  42  23  15  38  50  35  27  40  28
     * 6    14  27  42  23  15  38  50  35  27  40  28
     * 6    14  27  42  23  15  38  50  35  27  40  28
     * 6    14  15  42  23  27  38  50  35  27  40  28
     * 6    14  15  42  23  27  38  50  35  27  40  28
     * 6    14  15  23  27  27  38  50  35  28  40  42
     * 6    14  15  23  27  27  38  50  35  28  40  42
     * 6    14  15  23  27  27  38  50  35  28  40  42
     * 6    14  15  23  27  27  38  50  35  28  40  42
     * 6    14  15  23  27  27  38  50  35  28  40  42
     * 6    14  15  23  27  27  38  50  35  28  40  42
     * 6    14  15  23  27  27  28  50  35  38  40  42
     * 6    14  15  23  27  27  28  50  35  38  40  42
     * 6    14  15  23  27  27  28  35  38  40  42  50
     */
    public static int partition1(int[] arr, int minIdx, int maxIdx) {
        int pivotIdx = minIdx;
        while (minIdx < maxIdx) {
            while (arr[minIdx] < arr[pivotIdx] && minIdx < maxIdx) {
                minIdx++;
            }
            while (arr[maxIdx] >= arr[pivotIdx] && maxIdx > minIdx) {
                maxIdx--;
            }
            if (minIdx < maxIdx) {
                swap(arr, minIdx, maxIdx);
            }
        }
        swap(arr, minIdx, pivotIdx);
        return minIdx;
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    private static void print(int[] arr) {
        for (int i : arr) {
            System.out.print(i + "\t");
        }
        System.out.println();
    }
}

相关文章

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • 面试准备--排序

    堆排序 快速排序(simple) 快速排序(regular) 归并排序 Shell排序 插入排序 选择排序 冒泡排序

  • 排序

    插入排序 选择排序 冒泡排序 归并排序 快速排序* 三路快速排序

  • 算法笔记01-排序#2

    快速排序敢叫快速排序,那它一定得快。 快速排序 概述 快速排序也是分治排序的典型,它快,而且是原地排序。不过,要防...

  • PHP 实现快速排序

    导语 这篇了解下快速排序。 快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-...

  • 快速排序的Python实现

    目录 快速排序的介绍 快速排序的Python实现 快速排序的介绍 快速排序(quick sort)的采用了分治的策...

  • 数据结构与算法 快速排序

    起因:快速排序,又称分区交换排序,简称快排,之前没有了解过,抽空学习一下。 快速排序 1 快速排序 快速排序的定义...

  • 数组-快速排序

    采用快速方式对数组进行排序 快速排序百科:快速排序(Quicksort)是对冒泡排序算法的一种改进.快速排序是通过...

  • OC数据结构&算法

    更多整理资料尽在?一平米小站 目录 选择排序 冒泡排序 插入排序 快速排序 双路快速排序 三路快速排序 堆排序 选...

  • 要成功就做一百题-94

    题目名称 今天来几个排序,都是经典题目,包括带拆分的快速排序,堆排序,归并排序。 描述 快速排序快速排序核心就是分...

网友评论

      本文标题:快速排序

      本文链接:https://www.haomeiwen.com/subject/uugnnhtx.html