算法描述:
输入n个整数,找出其中最小的k个数
算法实现:
/*************************************************************************
> File Name: main.c
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年04月25日 星期一 16时58分17秒
************************************************************************/
#include "GetLeastNum.h"
int main()
{
int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
int outdata[10] = {0};
GetLeastNum(data, 8, outdata, 4);
int i = 0;
for (i = 0; i < 4; i++)
printf("%d ", outdata[i]);
return 0;
}
/*************************************************************************
> File Name: GetLeastNum.h
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年04月25日 星期一 14时56分16秒
************************************************************************/
#ifndef _GETLEASTNUM_H
#define _GETLEASTNUM_H
#include <stdio.h>
#include <stdlib.h>
void GetLeastNum(int *input, int n, int *output, int k);
int partition(int *data, int length, int start, int end);
#endif
/*************************************************************************
> File Name: GetLeastNum.c
> Author: cyf
> Mail: XXX@qq.com
> Created Time: 2016年04月25日 星期一 14时59分50秒
************************************************************************/
#include "GetLeastNum.h"
/*
* 产生start到end的随机数
* */
int randomInRange(int start, int end)
{
int ret = start + rand()%(end - start + 1);
return ret;
}
/*
* 交换两个数字的位置
* */
void swap(int *num1, int *num2)
{
int tmp = *num1;
*num1 = *num2;
*num2 = tmp;
}
/*
* 返回选中数字位置,并使得选中的数字的左边的数都小于data[index],选中
* 数字右边的数都大于data[index]
* */
int partition(int *data, int length, int start, int end)
{
int ret = 0;
if (data == NULL || length < 0 ||start < 0 || end >= length)
{
ret = -1;
printf("func partition() err:%d\n", ret);
return ret;
}
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 GetLeastNum(int *input, int n, int *output, int k)
{
if (input == NULL || output == NULL ||k > n||k <= 0)
{
return ;
}
int start = 0;
int end = n - 1;
int i = 0;
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 (i = 0; i < k; i++)
{
output[i] = input[i];
}
}
CC = gcc
CFLAGS = -g -O2 -Wall
%.o:%.c
$(CC) -o $@ -c $(CFLAGS) $<
main:main.o GetLeastNum.o
$(CC) main.o GetLeastNum.o -o main $(CFLAGS)
clean:
rm -rf *.o mainCC = gcc