今年又败给了qsort,还是因为自己以前不重视,重新复习qsort。
1 #include <iostream> 2 using namespace std; 3 4 void qsort(int, int); 5 int a[101]; 6 7 int main() 8 { 9 int n, i; 10 cin >> n; 11 for(i=1;i<=n;i++) 12 cin >> a[i]; 13 qsort(1, n); 14 for(i=1;i<=n;i++) 15 cout << a[i] << " "; 16 cout << endl; 17 18 return 0; 19 } 20 21 void qsort(int l, int r) 22 { 23 int i, j, mid, p; 24 i = l; 25 j = r; 26 mid = a[(l+r)/2]; //将当前序列在中间位置的数定义为分隔数 27 do{ 28 while(a[i] < mid) //在左半部分寻找比中间数大的数 29 i++; 30 while(a[j] > mid) //在右半部分寻找比中间数小的数 31 j--; 32 if(i<=j){ //若找到一组与排序目标不一致的数对,则交换它们 33 p = a[i]; a[i] = a[j]; a[j] = p; 34 i++; j--; //继续找 35 } 36 }while(i<=j); //注意这里不能少了等号 37 38 if(l < j) 39 qsort(l, j); //若未到两个数的边界,则递归搜索左右区间 40 if(i < r) 41 qsort(i, r); 42 43 }
快速排序的时间的复杂性是 O(nlog2n),速度快,但它是不稳定(数值相同的记录经过 快速排序后,相对次序可能会发生改变)的排序方法。就平均时间而言,快速排序是目前被 认为是最好的一种内部排序方法。 由以上讨论可知,从时间上看,快速排序的平均性能优于前面讨论过的各种排序方法, 但快速排序需一个栈空间来实现递归。若每一趟排序都将记录序列均匀地分割成长度相接近的两个子序列,则栈的最大深度为 log(n+1)。
原文:http://www.cnblogs.com/sineagle/p/6006146.html