快速排序,第k小數
阿新 • • 發佈:2022-04-22
快速排序O(nlong)
1 #include<bits/stdc++.h> 2 #define N 100010 3 using namespace std; 4 5 int n; 6 int a[N]; 7 void qsort(int l,int r) { 8 if(l>=r) return; 9 int i=l,j=r,flag=a[l+r>>1]; 10 do { 11 while(a[i]<flag) i++; 12 while(flag<a[j]) j--; 13 ifView Code(i<=j) swap(a[i++],a[j--]); 14 } while(i<=j); 15 qsort(l,j),qsort(i,r); 16 } 17 int main() { 18 cin>>n; 19 for(int i=1; i<=n; i++) cin>>a[i]; 20 qsort(1,n); 21 for(int i=1; i<=n; i++) cout<<a[i]<<" "; 22 return 0; 23 }
快排求第k小數O(n)
1 #include<bits/stdc++.h> 2 #define N 5000010 3 using namespace std; 4 5 int n,k,ans; 6 int a[N]; 7 void kth(int l,int r) { 8 if(l==r) { 9 ans=a[l]; 10 return; 11 } 12 int i=l,j=r,mid=a[l+r>>1]; 13 do { 14 while(a[i]<mid) i++; 15 whileView Code(mid<a[j]) j--; 16 if(i<=j) swap(a[i++],a[j--]); 17 } while(i<=j); 18 if(k<=j) kth(l,j); 19 else if(i<=k) kth(i,r); 20 else kth(j+1,i-1); 21 } 22 int main() { 23 cin>>n>>k; 24 k++; 25 for(int i=1; i<=n; i++) scanf("%d",&a[i]); 26 kth(1,n); 27 cout<<ans<<endl; 28 return 0; 29 }
nth_element求第k小數