寻找第K小的数。

思想,利用快排思想,不断寻找分解点,将分界点的下标与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];
}

  

posted on 2016-04-18 21:34  徒步者_金伟  阅读(189)  评论(0编辑  收藏  举报