利用数组,从右向左遍寻找小于mid的 与空进行交换,再从左到右遍历寻找大于mid的
void quick_sort(int *s, int l, int r){
int mid = s[l];
int i = l;
int j = r;
while(i<j){
while(i<j&&s[j]>=mid){
j--;
}
if(i<j){
s[i] = s[j];
i++;
}
while(i<j&&s[i]<mid){
i++;
}
if(i<j){
s[j] = s[i];
j--;
}
}
s[i]=mid;
if(l<i-1)
quick_sort(s,l,i-1);
if(i<r)
quick_sort(s,i+1,r);
}
因为mid取的是最左端,遇到有序的数据就退化为O(n^2)了。
所以需要随机数,把随机选择的数与left位交换以下,然后执行你原有的过程,实现随机。(即是将原来的有序数据打乱)
int ran = left + rand()%(right-left);
int t=a[ran];
a[ran] = a[l];
a[l] = t;