既然写了归并排序,那就让我来写一些快速排序ios
快速排序spa
虽然它叫快速排序,可是它并无想象里那么快,快速排序的最差时间复杂度和冒泡排序是同样的都是O(N2),它的平均时间复杂度为O(NlogN)。然而归并排序的平均时间复杂度为O(NlogN)。code
下面是一个很是形象的图解blog
首先,有一组数,上面有哨兵i和哨兵j,两个哨兵分别从数列的最左端和最右端出发,选择第一个数为基准数,哨兵j要找小于6的数,而哨兵i要找大于6的数。(注意:必定要j先找,否则的话会很惨的)排序
这个时候,哨兵i和j都找到了本身要找的数,就把它们找到的数交换递归
交换后,两个哨兵继续向前走ci
这个时候他们又找到了各自要找的数,就继续交换io
交换后,继续进行class
这个时候,咱们发现,哨兵i和j相遇了,这个时候,咱们把基准数和他们相遇的数进行交换stream
这个时候,就会发现,基准数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 }