美文网首页
多语言版快速排序

多语言版快速排序

作者: ed72fd6aaa3c | 来源:发表于2018-07-24 11:12 被阅读6次

简介

快速排序(Quicksort)是对冒泡排序的一种改进。

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

以上内容摘自:百度百科

代码

Java版

private static final void sort(int[] array, int left, int right) {

    if (left >= right) {
        return;
    }

    // 选择一个支点,用于作为中心点,取左边第一个元素(左边的空位)
    int pivot = array[left];
    // low 指向了这个空位
    int low = left;
    int high = right;

    while (low < high) {

        // 从右向左遍历,当元素比支点大时,持续遍历,直到找到比支点小的元素
        while (low < high && pivot <= array[high]) {
            high--;
        }

        // 此时 high 指向的元素比支点小,应交换到左边的空位上,交换后 high 指向的位置将成为空位
        array[low] = array[high];

        // 从左向右遍历,当元素比支点小时,持续遍历,直到找到比支点大的元素
        while (low < high && pivot >= array[low]) {
            low++;
        }

        // 此时 low 指向的元素比支点大,应交换到右边的空位上,交换后 low 指向的位置将成为空位
        array[high] = array[low];

    }

    // 此时 low == high,该点为支点元素的位置
    array[low] = pivot;

    // 采用递归方式,将支点左边、右边的列表分别执行同样操作
    sort(array, left, low - 1);
    sort(array, low + 1, right);

}

int[] array = {27, 12, 36, 12, 24, 68, 59, 91, 45};
sort(array, 0, array.length - 1);

Python版

def quick_sort(lst, left, right):
    '''
    快速排序
    :param lst:
    :param left:
    :param right:
    :return:
    '''
    if left >= right:
        return

    pivot = lst[left]
    low = left
    high = right
    while low < high:

        # 先从右向左,是因为第一个空位在左边(支点位置)

        # 从右向左比较,直到找到元素值比支点大的(需要放在支点左边)
        while low < high and pivot <= lst[high]:
            high -= 1

        # 此时 high 指向元素应放在支点左边空位上,然后 high 即为空位
        lst[low] = lst[high]

        # 从左向右比较,直到找到元素值比支点小的(需要放在支点右边)
        while low < high and pivot >= lst[low]:
            low += 1

        # 此时 low 指向元素应放在支点右边空位上,然后 low 即为空位
        lst[high] = lst[low]

    # 此时 low == high,为支点值,支点此时正好放在正确的位置上了(无论升序还是降序,其所在位置都是正确的)
    lst[low] = pivot

    quick_sort2(lst, left, low - 1)
    quick_sort2(lst, low + 1, right)

lst = [27, 12, 16, 32, 71, 69, 21, 12, 44]
quick_sort(lst, 0, len(lst) - 1)

结语

对于快速排序算法来说,实际上大量的时间都消耗在了分区上面,因此一个好的分区实现是非常重要的。通常来说快速排序的其它几个变种都是在优化分区这一块,而且快速排序对较小数量规模的列表排序性能并不很高,所以也有结合其它排序算法实现整个排序过程的,典型的有使用快速排序对目标列表排序,当其接近有序时(此时每个分区的数据规模已经很小),停止快速排序,对接近有序的列表进行插入排序,而插入排序对于基本有序的列表有着接近线性的复杂度,这比完全使用快速排序完成排序的方式性能要更好一些。

相关文章

  • 七种常见的数组排序算法整理(C语言版本)

    ~~~C语言版本~~~ 冒泡排序 选择排序 直接插入排序 二分插入排序 希尔排序 快速排序 堆排序 排序算法是否稳...

  • 快速排序C语言版

  • 多语言版快速排序

    简介 快速排序(Quicksort)是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1962年提...

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

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

  • 面试准备--排序

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

  • 排序

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

  • 算法笔记01-排序#2

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

  • 看图说话排序算法之冒泡排序

    排序算法的种类非常多,这里总结冒泡排序和对冒泡排序的改进---快速排序的循环实现和递归实现。 一丶冒泡排序 假设待...

  • PHP 实现快速排序

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

  • 快速排序的Python实现

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

网友评论

      本文标题:多语言版快速排序

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