题目:输入n个整数 找出其中最小的K个数 例如输入 4 5 1 6 2 7 3 8 这8个数字 最小的4个数字是 1 2 3 4
解法1:排序 算法的时间复杂度为O(nlogn)
解法2:快速排序 查找第k个大的数 算法的时间复杂度为O(logn)
<pre name="code" class="cpp">#include <iostream>
#include <assert.h>
using namespace std;
int partion(int *A, int low,int high)
{
if (low >= high)
return -1;
int temp = A[low];
while (low < high)
{
while (A[high]>temp && low<high)
high--;
A[low] = A[high];
while (A[low] < temp && low<high)
low++;
A[high] = A[low];
}
A[low] = temp;
return (low+1);
}
int main()
{
int n;
cin >> n;
if (n <= 0)
{
cout<<"Error n!";
return 0;
}
int *A = new int[n];
for (int i = 0;i < n;i++)
cin >> A[i];
cout << "输入K:" << endl;
int k;
cin >> k;
if (k <= 0 || k>n)
{
cout << "Error k!";
return 0;
}
if (k == n)
{
for (int i = 0;i < n;i++)
cout<< A[i]<<' ';
return 0;
}
int t = 0;
int s = 0;
int e = n - 1;
while (true)
{
t = partion(A, s, e);
if (t == k)
{
for (int i = 0;i <k;i++)
cout << A[i] << ' ';
cout << endl;
break;
}
else
{
if (t < k)
{
s = t;
e = n - 1;
}
else
{
e = t - 1;
}
}
}
delete [ ] A;
return 0;
}
解法3: 如果数据很多 我们可以创建一个大小为k的数据容器来存储最小的K个数 接着每次从输入的n个整数中读入一个整数 如果容器中已有的数字少于k个 则直接把这次读入的整数放入容器之中 如果容器中已有K个数字 找出这已有的k个数字中最大值 将其与准备插入的数字进行比较 如果这个数字比最大值大 则不需要插入容器
如果最大值比这个数字大则将最大值替换
因此可以用最大堆实现这个容器
4300

被折叠的 条评论
为什么被折叠?



