【排序】快速排序
既然写了归并排序,那就让我来写一些快速排序
快速排序
虽然它叫快速排序,但是它并没有想象里那么快,快速排序的最差时间复杂度和冒泡排序是一样的都是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 }