算法考题---最小的k个数
来源:互联网 发布:三维模拟仿真软件 编辑:程序博客网 时间:2024/05/22 23:30
输入n个整数,找出其中最小的k个数。
#include<iostream>
#include<stdio.h>#include <stdlib.h>
#include <exception>
#include <set>
#include <vector>
using namespace std;
int RandomInRange(int min, int max)
{
int random = rand() % (max - min + 1) + min;
return random;
}
void Swap(int* num1, int* num2)
{
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
int Partition(int data[], int length, int start, int end)
{
if(data == NULL || length <= 0 || start < 0 || end >= length)
return -1;
int index = RandomInRange(start, end);
Swap(&data[index], &data[end]);
int small = start - 1;
for(index = start; index < end; ++ index)
{
if(data[index] < data[end])
{
++ small;
if(small != index)
Swap(&data[index], &data[small]);
}
}
++ small;
Swap(&data[small], &data[end]);
return small;
}
void GetLeastNumbers1(int *input,int n,int *output,int k)
{
if(input == NULL || output == NULL || k > n || n <= 0 || k <= 0)
return;
int start = 0;
int end = n - 1;
int index = Partition(input,n,start,end);
while(index != k-1)
{
if(index > k -1)
{
end = index -1;
index = Partition(input,n,start,end);
}
else
{
start = index + 1;
index = Partition(input,n,start,end);
}
}
for(int i = 0;i < k;++i)
{
output[i] = input[i];
}
}
typedef multiset<int,greater<int> > intSet;
typedef multiset<int,greater<int> >::iterator setIterator;
void GetLeastNumbers2(const vector<int> &data,intSet &leastNumbers,int k)
{
leastNumbers.clear();
if(k < 1 || data.size() < k)
return;
vector<int>::const_iterator iter = data.begin();
for(;iter != data.end();++iter)
{
if((leastNumbers.size()) < k)
leastNumbers.insert(*iter);
else
{
setIterator iterGreatest = leastNumbers.begin();
if(*iter < *(leastNumbers.begin()))
{
leastNumbers.erase(iterGreatest);
leastNumbers.insert(*iter);
}
}
}
}
void Test(char* testName,int* data,int n ,int* expectedResult,int k)
{
if(testName != NULL)
printf("%s begins: \n", testName);
vector<int>vectorData;
for(int i =0; i < n; ++i)
vectorData.push_back(data[i]);
if(expectedResult == NULL)
printf("The input is invalid, we don't expect any result.\n");
else
{
printf("Expected result: \n");
for(int i = 0; i < k; ++ i)
printf("%d\t", expectedResult[i]);
printf("\n");
}
printf("Result for solution1:\n");
int *output = new int[k];
GetLeastNumbers1(data, n, output, k);
if(expectedResult != NULL)
{
for(int i = 0; i < k; ++ i)
printf("%d\t", output[i]);
printf("\n");
}
delete[] output;
printf("Result for solution2:\n");
intSet leastNumbers;
GetLeastNumbers2(vectorData, leastNumbers, k);
printf("The actual output numbers are:\n");
for(setIterator iter = leastNumbers.begin() ; iter != leastNumbers.end();++iter )
printf("%d\t", *iter);
printf("\n\n");
}
void Test1()
{
int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
int expected[] = {1, 2, 3, 4};
Test("Test1", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
}
void Test2()
{
int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
int expected[] = {1, 2, 3, 4, 5, 6, 7, 8};
Test("Test2", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
}
void Test3()
{
int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
int* expected = NULL;
Test("Test3", data, sizeof(data) / sizeof(int), expected, 10);
}
void Test4()
{
int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
int expected[] = {1};
Test("Test4", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
}
void Test5()
{
int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
int* expected = NULL;
Test("Test5", data, sizeof(data) / sizeof(int), expected, 0);
}
void Test6()
{
int data[] = {4, 5, 1, 6, 2, 7, 2, 8};
int expected[] = {1, 2};
Test("Test6", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
}
void Test7()
{
int* expected = NULL;
Test("Test7", NULL, NULL, expected, 0);
}
int main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
return 0;
}
阅读全文
0 0
- 算法考题---最小的k个数
- 算法---寻找最小的k个数
- 最小的K个数(算法)
- bfprt算法求最小的k个数
- 算法题/最小的k个数
- n个数中的最小的k个数的BFPRT算法
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的K个数
- 最小的k个数
- 最小的K个数
- Android七种样式dialog
- 线段树
- [ZigBee] 1、 ZigBee简介
- 计蒜客 跳跃游戏2(dp)
- 整除的尾数 oj83
- 算法考题---最小的k个数
- thinkphp 内部函数 D()、F()、S()、C()、L()、A()、I()
- 冒泡排序,选择排序,插入排序
- C++单例模式
- 【密码】 oj85
- 又要开始写博客咯
- poj-1088-滑雪(nswoj-1106-skiing)
- iOS中label的自适应高度
- Spring基础知识总结