【排序】快速排序

既然写了归并排序,那就让我来写一些快速排序

快速排序

虽然它叫快速排序,但是它并没有想象里那么快,快速排序的最差时间复杂度和冒泡排序是一样的都是O(N2),它的平均时间复杂度为O(NlogN)。然而归并排序的平均时间复杂度为O(NlogN)。

下面是一个非常形象的图解

首先,有一组数,上面有哨兵i和哨兵j,两个哨兵分别从数列的最左端和最右端出发,选择第一个数为基准数,哨兵j要找小于6的数,而哨兵i要找大于6的数。(注意:一定要j先找,不然的话会很惨的)

这个时候,哨兵i和j都找到了自己要找的数,就把它们找到的数交换

交换后,两个哨兵继续向前走

这个时候他们又找到了各自要找的数,就继续交换

交换后,继续进行

这个时候,我们发现,哨兵i和j相遇了,这个时候,我们把基准数和他们相遇的数进行交换

这个时候,就会发现,基准数6,已经归位了

之后,我们就可以按照同样的方法,分别把6左右的数列进行排序,最后就可以得到一个有序数列了

上图是一个总结

OK!代码如下:

 1 #include<iostream>
 2 #include<cmath>
 3 using namespace std;
 4 int data[1000];
 5 void qsort(int left, int right){
 6     if (left > right) return;    //结束 
 7     int temp=data[left];        //temp是基准数 
 8     int i=left;
 9     int j=right;
10     while (i != j){
11         while (data[j]>=temp && i<j)    //右区间找比基准数大的数 
12             j--;
13         while (data[i]<=temp && i<j)    //左区间找比基准数小的数 
14             i++;
15         if (i<j) swap(data[i],data[j]);    //一次寻找结束,交换两个数 
16     }
17     swap(data[left],data[i]);            //基准数归位 
18     qsort(left,i-1);                    //递归 
19     qsort(i+1,right);
20 }
21 int main()
22 {
23     int n;
24     cin>>n;
25     for (int i=1; i<=n; i++)
26         cin>>data[i];
27     qsort(1, n);
28     for (int i=1; i<=n; i++)
29         cout<<data[i]<<" ";
30 }

 

posted @ 2019-03-21 18:17  夜雨声烦fff  阅读(55)  评论(0编辑  收藏