南大算法设计与分析课程复习笔记(4)L4

一、快速排序

 算法导论上关于快速排序有两种写法

第一种,从头到尾遍历,不断将小于基准元素的项移到前面。代码很简介,只需要维护一个交换位置,表示小于基准元素的末尾位置加一

我们看算法导论上的一个例子:

代码实现(代码中用p记录上面i+1的位置,pos2应该为数组长度减1):

void quicksort(vector<int>& v, int pos1,int pos2) {
    if (pos1 >= pos2) return;
    int p = pos1;
    for (int i = pos1; i < pos2; ++i) {
        if (v[i] < v[pos2]) {
            swap(v[p], v[i]);
            ++p;
        }
    }
    swap(v[p],v[pos2]);
    quicksort(v,pos1,p-1);
    quicksort(v,p+1,pos2);
}

第二种,维护两个位置,第一个位置向后寻找,直到找到大于pivot的元素,第二个位置向前寻找,直到找到小于pivot的元素,然后互换。

代码实现:

void quicksort2(vector<int>& v, int pos1, int pos2) {
    if (pos1 >= pos2) return;
    int p1 = pos1;
    int p2 = pos2;
    int p = v[pos1];
    while (true) {
        while (p1<pos2 && v[p1]<=p) {
            ++p1;
        }
        while (p2>pos1 && v[p2]>=p) {
            --p2;
        }
        if (p1 < p2)
            swap(v[p1], v[p2]);
        else
            break;
    }
    swap(v[pos1],v[p2]);
    quicksort2(v,pos1,p2-1);
    quicksort2(v,p2+1,pos2);
}

二、快速排序的分析

最坏情况、平均情况什么的,懒得写了,书上很清楚,不啰嗦了,算法导论上也有很多。

原文地址:https://www.cnblogs.com/likaiming/p/8638656.html