自己写的快排超时,帮忙看看

学术版

@[Sean_xzx](/user/546830) 这是标准的手写快排 ``` void qsort(int l,int r) { double mid=a[(l+r)/2]; int i=l,j=r; do{ while(a[i]<mid)i++; while(a[j]>mid)j--; if(i<=j) { swap(a[i],a[j]); i++; j--; } }while(i<=j); if(l<j) qsort(l,j); if(i<r) qsort(i,r); } ```
by Cheng_666 @ 2022-09-28 22:56:49


@[Sean_xzx](/user/546830) 改掉几行细节应该就过了
by Cheng_666 @ 2022-09-28 22:58:31


@[Sean_xzx](/user/546830) 真的能把j分段用吗
by xs_siqi @ 2022-09-28 23:11:28


@[Sean_xzx](/user/546830) ~~真的是~~二分 ``` qsort(l,j-1); qsort(j+1,r) ```
by Cheng_666 @ 2022-09-28 23:26:34


@[xs_siqi](/user/401088) 这个不可以吗?
by XSean @ 2022-09-28 23:27:43


@[Sean_xzx](/user/546830) 可以是可以,但是绝对超时
by Cheng_666 @ 2022-09-28 23:35:08


@[cx341694241](/user/203172) 还是不行 ```cpp #include<bits/stdc++.h> using namespace std; //qsort(); int n,arr[1001]; void qsort(int l,int r){ if(l>=r) return; int temp=arr[(l+r)/2]; int mid=(l+r)/2; int i=l,j=r; while(i<j){ while(arr[i]<temp) i++; while(arr[j]>temp) j--; if(i<j){ swap(arr[i],arr[j]); } // cout<<endl<<"temp:"<<temp<<" i:"<<i<<" j:"<<j<<endl; // for(int i=1;i<=n;i++) cout<<arr[i]<<" "; // cout<<endl; } qsort(l,j-1); qsort(i+1,r); } int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>arr[i]; qsort(1,n); for(int i=1;i<=n;i++) cout<<arr[i]<<" "; return 0; } ```
by XSean @ 2022-09-28 23:36:55


@[Sean_xzx](/user/546830) 这样才不会超时 ``` qsort(l,j); qsort(i,r); ```
by Cheng_666 @ 2022-09-28 23:36:59


@[cx341694241](/user/203172) 话说这是什么原理
by XSean @ 2022-09-28 23:41:15


@[Sean_xzx](/user/546830) 这是修改后的 ``` #include<bits/stdc++.h> using namespace std; int n,arr[100000]; void qsort(int l,int r){ if(l>=r) return; int temp=arr[(l+r)/2]; int mid=(l+r)/2; int i=l,j=r; while(i<=j){ while(arr[i]<temp) i++; while(arr[j]>temp) j--; if(i<=j){ swap(arr[i],arr[j]); i++; j--; } } qsort(l,j); qsort(i,r); } int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>arr[i]; qsort(1,n); for(int i=1;i<=n;i++) cout<<arr[i]<<" "; return 0; } ```
by Cheng_666 @ 2022-09-28 23:41:35


| 下一页