問題描述:n個數中找出第k小的元素
輸入:
9
5 3 8 1 4 6 9 2 7
4
輸出:
4
用快排思想先找出數組中第一個元素的位置(博客中有快排算法):
排序前:5 3 8 1 4 6 9 2 7
排序后:2 3 4 1 5 6 9 8 7 (5的位置確定了)
用k與元素5的下標計較,等於就輸出,小於遞歸5前的元素,大於遞歸5后的元素
代碼:
#include<iostream> using namespace std; void QuickSort(int *a,int left,int right,int k) { int i=left; int j=right; while(i<j) { int temp; //從后往前比較 while(i<j && a[i]<a[j]) j--; if(i<j) { temp=a[i]; a[i]=a[j]; a[j]=temp; i++; } //從前往后比較 while(i<j && a[i]<a[j]) i++; if(i<j) { temp=a[i]; a[i]=a[j]; a[j]=temp; j--; } } if(k==i) { cout<<a[k]; return; } else if(k<i) { QuickSort(a,left,i-1,k); } else { QuickSort(a,j+1,right,k); } } int main() { int n; int k; int a[100]; cin>>n; int left=1,right=n;//對應下標位置 for(int i=1; i<=n; i++) { cin>>a[i]; } cin>>k; QuickSort(a,left,right,k); return 0; }
