《Linux C编程一站式学习》读书笔记(3)

在一组随机的数中找到第K小数。

思路:跟快速排序的思路长不多。快排每次能找到数组A中第N小的数。如果K=N,那么A[k]就是我们想要得到的结果;如果K>N,则递归在数组的左侧继续找第N小数;如果K<N,则递归在数组的右侧找第N-K小数。

#include "stdio.h"
#include "stdlib.h"

int findK(int *,int ,int);

void main()
{
	int n;
	printf("请输入所有数的个数:\n");
	scanf("%d",&n);
	int *num;
	num = (int*)malloc(n*sizeof(int));
	for(int i = 0 ; i < n ; i++)
	{
		printf("请输入第%d个数:\n",i+1);
		scanf("%d",&(num[i]));
	}
	int k;
	printf("请输入k的值:\n");
	scanf("%d",&k);
	int result = findK(num,k,n);
	printf("数组中第%d小的数为:%d",k,result);
	char c;
	scanf("%c",&c);
	scanf("%c",&c);
}

int findK(int * array,int k,int n)
{
	int *left = new int[n];//与标准的快排有差别,我通过新开一个长度为n的数组来存储左边的数组
	int *right = new int[n];
	int lNum = 0,rNum = 0;
	for(int i = 1 ; i < n ; i++)
	{
		if (array[i] < array[0])
		{
			left[lNum] = array[i];
			lNum++;
		}
		else if (array[i] >= array[0])
		{
			right[rNum] = array[i];
			rNum++;
		}
	}
	left[lNum] = array[0];
	lNum++;
	if (lNum == k)
		return left[lNum-1];
	else if(lNum > k)
		return findK(left,k,lNum);
	else if (lNum < k)
		return findK(right,k-lNum,rNum);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值