小朋友学数据结构(7):快速排序

作者: 海天一树X | 来源:发表于2018-06-15 22:37 被阅读95次

(一)基本思想

选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

(二)例子

6-1.png

以{5, 9, 2, 7 ,8, 3, 6, 1, 4, 0}为例。
选择第0个元素5作为参照数,咱们第一步的目标是把比5小的数都调整到5的左边,比5大的数都调到5的右边。
(1)从左往右开始观察,发现9比5大,准备调整。再从右往左观察,发现0比5小,准备调整。对调9和0的位置。
(2)继续从左往右观察,2比5小,不用调。继续往右,7比5大,准备调整。继续从右往左观赛,4比5小,准备调整。对调7和4的位置。
(3)继续从左往右观察,8比5大,准备调整。继续从右往左观察,1比5小,准备调整。对调8和1的位置。
(4)继续从左往右观察,3比5小,不用调整。继续往右观察,碰到6,准备调整。继续从右往左观察,第一个碰到的就是6,这时从左往右或者从右往左碰到的都是6,所以6不用调,也不需要再继续观察下去了。
(5)最后一次调整一下3和5的位置。得到了第一步的目标,比5小的{3, 0, 2, 4, 1}都在5的左边,比5大的{6, 8, 7, 9}都在5的右边。
(6)对新数列{3, 0, 2, 4, 1}和{6, 8, 7, 9}分别用上面的方法继续调整,直到所有的数都排完序为止。

(三)C++代码实现

#include <iostream>
using namespace std;

void QuickSort(int a[], int low, int high)
{
    if(low >= high)
    {
        return;
    }
    
    int pivot = a[low];
    int i = low + 1;
    int j = high;
    
    while(i <= j)
    {
        if(a[i] <= pivot)
        {
            i++;
        }
        else if(a[j] > pivot)
        {
            j--;
        }
        else
        {
            // swap a[i], a[j]
            a[i] ^= a[j];
            a[j] ^= a[j];
            a[i] ^= a[j];
            i++;
            j--;
        }
    }
    
    // swap a[low] , a[j]
    a[low] = a[j];
    a[j] = pivot;
    j--;
    
    QuickSort(a, low, j);
    QuickSort(a, i, high);
}

void PrintArrary(int data[], int size)
{
    for (int i = 0; i < size; ++i)
    {
        cout << data[i] << " ";
    }
    
    cout << endl;
}

int main(int argc, const char** argv)
{
    int array[]= {5, 9, 2, 7, 8, 3, 6, 1, 4, 0};
    int size = sizeof(array)/sizeof(int);
    QuickSort(array, 0, size - 1);
    PrintArrary(array, size);
    
    return 0;
}

运行结果:

0 1 2 3 4 5 6 7 8 9

TopCoder & Codeforces & AtCoder交流QQ群:648202993
更多内容请关注微信公众号


wechat_public_header.jpg

相关文章

  • 小朋友学数据结构(7):快速排序

    (一)基本思想 选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比...

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 排序算法6:快速排序

    数据结构与算法 快速排序为应用最多的排序算法,因为快速二字而闻名。快速排序和归并排序一样,采用的都是分治思想。 分...

  • Python 算法大全

    这个库涵盖了多种算法和数据结构的介绍,比如: 排序算法(冒泡排序、希尔排序、插入排序、桶排序、合并排序、快速排序、...

  • C语言:关于数据的几种排序算法

    数据结构的排序算法有很多种。其中,快速排序、希尔排序、堆排序、直接选择排序不是稳定的排序算法;基数排序、冒泡排序、...

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

    数据结构与算法——快速排序 快速排序,顾名思义,它速度很快,针对一般应用中各种不同的输入都要比其他排序算法快很多,...

  • 排序算法-快速排序

    数据结构 排序算法 快速排序 快速排序的做法是通过找到一个枢纽(pivot),这个枢纽可以将数组划分为两部分,一部...

  • 玩转算法面试:(三)LeetCode数组类问题

    数组中的问题其实最常见。 排序:选择排序;插入排序;归并排序;快速排序查找:二分查找法数据结构:栈;队列;堆…… ...

  • 算法(3)- 数组

    数组中的问题其实最常见如:排序(选择排序、插入排序、归并排序、快速排序)、查找(二分查找法)、数据结构(栈、队列、...

  • 算法与数据结构路线图

    学习算法与数据结构,深刻理解计算机科学 排序算法:插入、冒泡、选择、希尔、快速、归并、堆排序、计数排序、桶排序、基...

网友评论

本文标题:小朋友学数据结构(7):快速排序

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