算法考题---最小的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;
}
原创粉丝点击