快速排序算法

来源:互联网 发布:2017淘宝卖什么赚钱 编辑:程序博客网 时间:2024/05/29 13:47

反正都是抄书。


#include <iostream>#include <vector>#include <algorithm>using namespace std;//一趟快速排序的算法int QuickOnePass(vector<int>& DataArray, int leftPos, int rightPos){    int left = leftPos;    int right = rightPos;    int tmp = DataArray[left]; //腾空 left 位置    do    {        while(DataArray[right] >= tmp && right > left)        {            right--;        }        if (right > left)        {            DataArray[left] = DataArray[right];            left++;        }        while(DataArray[left] <= tmp && right > left)        {            left++;        }        if (right > left)        {            DataArray[right] = DataArray[left];            right--;        }    }while(left != right);    DataArray[left] = tmp;    return left;}/*快速排序: 通过一趟排序将待排序记录分割成两个独立的部分,其中一部分记录的关键字均小于等于另一部分记录的关键字,再分别对这两部分记录进行下一趟排序,最后使整个记录序列有序.*/void QuickSort(vector<int>& DataArray, int leftPos, int rightPos){    cout << endl << "排序中, leftPos = " << leftPos << ", rightPos = " << rightPos << ", 序列: ";    for_each(DataArray.begin(), DataArray.end(), [](int value){cout << value << " ";});    if (leftPos < rightPos)    {        int midPos = QuickOnePass(DataArray, leftPos, rightPos); //将序列划分为两部分        QuickSort(DataArray, leftPos, midPos);     //对左端的序列进行排序        QuickSort(DataArray, midPos + 1, rightPos); //对右端的序列进行排序    }}/* 时间复杂度:O(nlogn)。快速排序是不稳定的。 */int main(){    vector<int> vec = {1, 9, 2, 8, 3, 7, 4, 6, 5};    cout << endl << "排序前的序列是这样的: ";    for_each(vec.begin(), vec.end(), [](int& value){cout << value <<  " ";});    QuickSort(vec, 0, vec.size()-1);    cout << endl << "排序后的序列是这样的: ";    for_each(vec.begin(), vec.end(), [](int& value){cout << value << " ";});    cin.get();}

结果:

排序前的序列是这样的: 1 9 2 8 3 7 4 6 5
排序中, leftPos = 0, rightPos = 8, 序列: 1 9 2 8 3 7 4 6 5
排序中, leftPos = 0, rightPos = 0, 序列: 1 9 2 8 3 7 4 6 5
排序中, leftPos = 1, rightPos = 8, 序列: 1 9 2 8 3 7 4 6 5
排序中, leftPos = 1, rightPos = 8, 序列: 1 5 2 8 3 7 4 6 9
排序中, leftPos = 1, rightPos = 4, 序列: 1 4 2 3 5 7 8 6 9
排序中, leftPos = 1, rightPos = 3, 序列: 1 3 2 4 5 7 8 6 9
排序中, leftPos = 1, rightPos = 2, 序列: 1 2 3 4 5 7 8 6 9
排序中, leftPos = 1, rightPos = 1, 序列: 1 2 3 4 5 7 8 6 9
排序中, leftPos = 2, rightPos = 2, 序列: 1 2 3 4 5 7 8 6 9
排序中, leftPos = 3, rightPos = 3, 序列: 1 2 3 4 5 7 8 6 9
排序中, leftPos = 4, rightPos = 4, 序列: 1 2 3 4 5 7 8 6 9
排序中, leftPos = 5, rightPos = 8, 序列: 1 2 3 4 5 7 8 6 9
排序中, leftPos = 5, rightPos = 6, 序列: 1 2 3 4 5 6 7 8 9
排序中, leftPos = 5, rightPos = 5, 序列: 1 2 3 4 5 6 7 8 9
排序中, leftPos = 6, rightPos = 6, 序列: 1 2 3 4 5 6 7 8 9
排序中, leftPos = 7, rightPos = 8, 序列: 1 2 3 4 5 6 7 8 9
排序中, leftPos = 7, rightPos = 7, 序列: 1 2 3 4 5 6 7 8 9
排序中, leftPos = 8, rightPos = 8, 序列: 1 2 3 4 5 6 7 8 9
排序中, leftPos = 9, rightPos = 8, 序列: 1 2 3 4 5 6 7 8 9
排序后的序列是这样的: 1 2 3 4 5 6 7 8 9

原创粉丝点击