快速排序(C++实现)

快速排序

如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 q+1 到 r 之间是大于 pivot 的。根据分治、递归的处理思想,我们可以用递归排序下标从 p 到 q-1 之间的数据和下标从 q+1 到 r 之间的数据,直到区间缩小为 1,就说明所有的数据都有序了。

最优时间复杂度 O(nlogn)
平均时间复杂度O(nlogn)
最差时间复杂度O(n^2) 假设此时数组已经为有序了,但是我们仍未一直设置末尾的那个值为pivot。

其于归并排序相比优点为:他的时间复杂度为O(1)。所以就算其最差时间复杂度可能退化到O(n^2),仍为人们倾向于使用的算法,而且现在人们研究出了很多措施来尽量避免其退化到 O(n^2)

代码:

#include <iostream>
#include <vector>
using namespace std;

int getPartition(vector<int>& nums,int head,int rear)
{
    int value=nums[rear];
    int i=head,j=0,temp=0;
    for(j=head;j<rear;j++)
    {
        if(nums[j]<value)
        {
            temp=nums[j];
            nums[j]=nums[i];
            nums[i]=temp;
            i++;
        }
    }
    temp=nums[rear];
    nums[rear]=nums[i];
    nums[i]=temp;
    return i;
}

void quickSort(vector<int>& nums,int head,int rear)
{
    if(head>=rear)
    {
        return;
    }
    else
    {
        int loc=getPartition(nums,head,rear);
        quickSort(nums,head,loc-1); //注意要是-1而不能这里是loc下一行是加1
        quickSort(nums,loc+1,rear);
    }
}

int main()
{

    vector<int> test;
    test.push_back(5);
    test.push_back(13);
    test.push_back(13);
    test.push_back(7);
    test.push_back(19);
    test.push_back(12);
    test.push_back(4);
    test.push_back(6);
    test.push_back(1);
    test.push_back(2);
    test.push_back(3);
    test.push_back(8);
    for(int i=0;i<test.size();i++)
    {
        cout<<test[i]<<" ";
    }
    cout<<endl;
    int qsize=test.size();
    quickSort(test,0,qsize-1);
    for(int i=0;i<test.size();i++)
    {
        cout<<test[i]<<" ";
    }
    return 0;

}


发布了48 篇原创文章 · 获赞 23 · 访问量 1303

猜你喜欢

转载自blog.csdn.net/qq_37724465/article/details/104333282