标签:
思想,利用快排思想,不断寻找分解点,将分界点的下标与K-1比较如果相等,返回该值,否则更新左右边界。当左右边界中的值少于等于2个时,运用插入排序,返回a[k-1]
int findCut(vector<int>& a, int l, int r) { if (l + 1 >= r) { return -1; } int pivot = a[l]; int i = l, j = r; while (true) { do { i++; } while (i<r&&a[i] < pivot); do { j--; } while (j>l&&a[j] >= pivot); if (i >= j)break; int temp = a[i]; a[i] = a[j]; a[j] = temp; } a[l] = a[j]; a[j] = pivot; return j; } void insert_sort(vector<int>&a, int l, int r) { for (int i = l + 1; i < r; i++) { int j=i,pivot = a[i]; while (j>l&&pivot < a[j-1]) { a[j] = a[j - 1]; j--; } a[j] = pivot; } } int findKth(vector<int>a, int n, int K) { int left = 0, right = n; while (left+1 < right) { int cut = findCut(a, left, right); if (cut == K - 1)return a[cut]; else if (cut < K - 1) { left = cut + 1; } else { right = cut; } } insert_sort(a, left, right); return a[K-1]; }
标签:
原文地址:http://www.cnblogs.com/jinweiseu/p/5405979.html