1. 程式人生 > 其它 >快速排序,第k小數

快速排序,第k小數

快速排序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         if
(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 }
View Code

快排求第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         while
(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 }
View Code

nth_element求第k小數