其他分享
首页 > 其他分享> > 排序优化——模拟栈及三路快排

排序优化——模拟栈及三路快排

作者:互联网

几乎所有的编程语言都会提供排序函数,比如 C 语言的 qsort(), C++ STL 中的 sort(),这些排序函数是如何实现的呢?

1. 如何选择合适的排序算法?

如果要实现一个通用的高效率的排序函数,我们应该选择那种排序算法呢?


2. 如何优化快速排序?

快速排序最坏情况下时间复杂度退化为 \(O(n^2)\) ,我们怎样来避免这种情况的发生呢?

2.1. 分区点优化问题

2.2. 堆栈溢出问题

快速排序是利用递归来实现的,当递归的的深度过深时,就会导致堆栈溢出。


3. C 语言的 qsort() 函数?


4. 模拟栈的快速排序算法

int Partition(float data[], int left, int right)
{
    int i = left, j = left;
    int pivot = data[right];

    for (j = left; j < right; j++)
    {
        if (data[j] < pivot)
        {
            int temp = data[i];
            data[i] = data[j];
            data[j] = temp;
            i++;
        }
    }

    data[j] = data[i];
    data[i] = pivot;
    return i;
}

void Quick_Sort(float data[], int left, int right)
{
    if (left < right)
    {
        stack<int> s;
        s.push(left);
        s.push(right);

        while (!s.empty())
        {
            int j = s.top();
            s.pop();
            int i = s.top();
            s.pop();

            int mid = Partition(data, i, j);
            // 至少有两个元素
            if (mid-1 > i)
            {
                s.push(i);
                s.push(mid-1);
            }
            if (j > mid+1)
            {
                s.push(mid+1);
                s.push(j);
            }
        }
    }
}

5. 三路划分快速排序

针对有重复数据的情况,三路划分将数据分为三部分:小于主元的、等于主元的和大于主元的,然后递归调用的时候只对两端的数据再排序,而不用处理中间相等的情况。

1.png

void Quick_Sort_3_Way(float data[], int left, int right)
{
    if (left < right)
    {
        float pivot = data[right];
        int l = left - 1;
        int j = left;
        int r = right;

        /*
        [left, l] 小于主元
        [l+1, j] 等于主元
        [j+1, right] 大于主元
        */

        while (j < r)
        {
            if (data[j] < pivot)
            {
                swap(data[j], data[++l]);
                j++;
            }
            else if (data[j] > pivot)
                swap(data[j], data[--r]);
            else    j++;
        }
        swap(data[j], data[right]);
        Quick_Sort_3_Way(data, left, l);
        Quick_Sort_3_Way(data, j+1, right);
    }
}

参考资料-极客时间专栏《数据结构与算法之美》


seniusen

   

标签:right,int,复杂度,栈及,快排,排序,data,left
来源: https://blog.51cto.com/u_15265149/2888225