/** * * @param a int整型一维数组 * @param aLen int a数组长度 * @param n int整型 * @param K int整型 * @return int整型 */ int findKth(int* a, int aLen, int n, int K ) { // write code here int i=0; int j=n-1; int temp=a[i]; while(i<j) { while(a[j]<=temp && i<j) j--; a[i]=a[j]; while(a[i]>=temp && i<j) i++; a[j]=a[i]; } if(i==(K-1)) return temp; else if(i<(K-1)){ return findKth(&a[i+1], aLen-1-i, aLen-1-i,K-i-1); } else return findKth(a,i, i, K); }
快排+剪枝
降序
快排时,每一次划分都能确定基准元素的位置;
当一次划分结束后,若基准元素位置等于K-1,则基准元素就是第K大元素;
若基准元素位置小于K-1,说明第K大元素小于当前基准元素,在右边继续查找,此时子数组的第K-i-1大元素是原数组的第K大元素;
若基准元素位置大于K-1,说明第K大元素大于当前基准元素,在左边继续查找,此时子数组的第K大元素是原数组的第K大元素;