线性时间内从一个数组中找出第K个最小的元素——编程珠玑
题目:编写程序,在O(n)时间内从数组x[0...n-1]中找出第k个最小的元素,算法中可以对x中的元素进行排序。
思路:快速排序选择一个pivot对数组进行划分,左边小于pivot,右边大于等于pivot,所以我们计算左边小于pivot(加上pivot)的个数count总共有多少,如果等于k,正是我们所要的,如果大于k,说明第k小的数在左边,那就在左边进行我们的递归;否则,在右边,那么说明右边的第k-count小的数就是我们所要的,在右边进行我们的递归。
算法实现一:
- #include<iostream>
- using namespace std;
- inline void Swap(int a[],int i,int j)//内联函数,交换两个元素位置
- {
- int temp=a[i];
- a[i]=a[j];
- a[j]=temp;
- }
- int Partition(int a[],int p,int r)//根据pivot a[r]来划分数组
- {
- int pivot=a[r];
- int low=p-1;
- int i;
- for(i=p;i