做1306的sorting algorithm的时候
一开始写的快排超时了
然后用ilovenwd师兄提供了下面的快排才过了
你快排写得不好.
试试一组 1000000 个0的数据.
参考一下下面这个
关键的不是左边或间.void quick_sort(int *a,int n) {
int i=0, j=n-1;
int x=a[n/2];
while(i<=j) {
while(a[i]<x) i++; //注意<不是<=
while(a[j]>x) j--;
if(i<=j) swap(a[i],a[j]), ++i, --j;
}
if(j>0) quick_sort(a,j+1);
if(i<n-1) quick_sort(a+i, n-i);
}
而是 那个<和<=的区别.
你去看一些比较好的算法书.比如Robert Sedgewick那本.有详细分析.
如果你觉得取中间有可能O(n^2)就一开始就随机Shuffle一下.不过基本没必要.
===============
void sort(int l,int r)
{
int i,j,x,t;
i=l;j=r;x=a[(l+r)/2];
do {
while ((a[i]<x)&&(i<r)) i++;
while ((a[j]>x)&&(j>l)) j--;
if (i<=j) {t=a[i];a[i]=a[j];a[j]=t;i++;j--;}
} while (i<=j) ;
if(l<j) sort(l,j);
if(r>i) sort(i,r);
}
一个关于快排的问题
最新推荐文章于 2020-01-22 21:09:53 发布