分治算法——快速排序

来源:互联网 发布:无法无天小说吾知 编辑:程序博客网 时间:2024/06/06 00:57

快速排序是所有排序里最受欢迎的排序算法,时间复杂度O(NlogN),如果测试数据是有序的话,时间复杂度会下降到线性,也就是O(N^2),算法的核心思想是:挖坑填数。算法代码一般采用递归的形式。
算法思想:
找到一个基准数,也叫哨兵,在我的代码中为temp,用这个基准数去比较其他的所有数字,如果是从小到大排序的话,就让基准数左边的数都小于它,右边的数都大于它,如果是从大到小的话,反之。然后再把它左边的数再这样操作一遍,右边的数也这样操作一遍,依次递归,直到整个数字集合里只剩下一个数,则默认为这个数是有序的,返回。
举个例子:
共有5个数,分别为1 5 2 4 3.
第一次操作,操作的数分别为1 5 2 4 3。默认基准数为第一个数,或者或者随便什么一个数,这里默认为第一个数。第一个数为1,它右边的数都大于它,所以第一次操作的结果为:1 5 2 4 3.
第二次操作,因为1的左边没有数,直接退出。
第三次操作,操作的数分别为5 2 4 3。选基准数为5,5是最大的,所以第三次的操作结果为:2 4 3 5。
第四次操作,操作的数分别为2 4 3,。选基准数为2,2是最小的,所以第四次的操作结果为:2 4 3。
第五次操作,因为5是最大的,右边没有数,直接退出。
第六次操作,操作的数分别分为4 3,选基准数为4,操作结果为:3 4。
第六次操作,因为4左边没有数,退出。
第七次操作,操作的数为3,只有一个数,默认有序,退出。
代码:

#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>int num[1001];void q_sort(int l,int r){    if(l>r)return;    int i = l,j = r;    int temp = num[i];    while(i!=j)    {        while(i<j&&num[j]>=temp)j--;        while(i<j&&num[i]<=temp)i++;        if(i<j)std::swap(num[i],num[j]);    }    num[l] = num[i];    num[i] = temp;    q_sort(l,i-1);q_sort(i+1,r);}int main(){    int n;    std::cin>>n;    for(int i = 0;i<n;i++)std::cin>>num[i];    q_sort(0,n-1);    for(int i = 0;i<n;i++)std::cout<<num[i]<<" ";    return 0;}
原创粉丝点击