在O(n)时间内找出最小的k个元素

思想:1.用大头堆实现 2.类似快速排序实现

1.用大头堆实现 《程序员面试一百题》解法

2.类似快速排序实现

//程序猴
#include "stdafx.h"
#include 
#include 
#include 
#include 
#include 
using namespace std;
//每次将数组划分为两部分,再在满足条件的一部分里找到第k小的数,它前面的数就是最小的k个数
void FindKLeastNums(int Data[],int lower,int upper,int Least_Size)
{
	if(Least_Sizeupper)
		return;
	int i = lower;int j = upper + 1;int Tmp;
	while (1)
	{
		do 
		{
			i++;
		} while (iData[lower]);
		if (i>j)
		  break;
		Tmp = Data[i];
		Data[i] = Data[j];
		Data[j] = Tmp;
	}
	Tmp = Data[lower];
	Data[lower] = Data[j];
	Data[j] = Tmp;
	if (jLeast_Size)
	{
		FindKLeastNums(Data,lower,j-1,Least_Size);
	}
	return;
}

int main(void)
{
	int data[10] = {1,3,5,2,6,8,4,9,0,7};
	printf("   原数组中元素:");
	int i = 0;
	while(i<10)
	{
		printf("%d ",data[i]);
		i++;
	}
	FindKLeastNums(data,0,9,5);
	printf("\n调整后最小的5个:");
    for (i = 0;i<5;i++)
    {
		printf("%d ",data[i]);
    }
    return 0;
}


运行结果

在O(n)时间内找出最小的k个元素_第1张图片




你可能感兴趣的:(数据结构与算法)