找出第k个最小的元素

/*
 *题目:编写程序,从数组x[0...n-1]中找出第k个最小的元素。算法可以对x中的元素进行排序
 */

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define LEN 10

typedef int dataType;

//初始化数组,数组元素为小于100的整数
void intiArr(dataType A[], int len);
//打印数组元素
void print(dataType A[], int len);
//找出第k小的数据并返回
dataType findKMin(dataType A[],int len,int k);
int main()
{
 int key;
 int k;
 dataType data[LEN+1];
 intiArr(data,LEN+1);
 data[0] = data[1];
 printf("数组元素:");
 print(data,LEN+1);
 printf("\n输入k的值(比如,要查找第2小的数字,则输入2),k值范围:1-%d\nk=",LEN);
 scanf("%d",&k);
 if(k > LEN || k < 0)
 {
  printf("输入k值错误,不在搜索范围内!\n");
  return 0;
 }
 key = findKMin(data,LEN,k);
 printf("\n第%d小的元素是%d\n",k,key);
 return 0;
}

//初始化数组,数组元素为小于100的整数
void intiArr(dataType A[], int len)
{
 int i;
 srand((unsigned)time(NULL));
 for(i = 1; i < len; i++)
 {
  A[i] = rand() % 100;
 }
}

//打印数组元素
void print(dataType A[], int len)
{
 int i;
 for(i = 1; i < len; i++)
 {
  if((i-1) % 5 == 0)
   printf("\n");
  printf("%d\t",A[i]);
 }
}

//找出第k小的数据并返回
dataType findKMin(dataType A[],int len,int k)
{
 int start = 1;
 int end = len;
 int low;
 int high;
 do
 { 
  low = start;
  high = end;
  A[0] = A[low];
  //printf("A[0]=%d\n",A[0]);
  while(low < high)
  {
   while((low < high) && (A[high] >= A[0]))
    high--;
   A[low] = A[high];
   while((low < high) && A[low] <= A[0])
    low++;
   A[high] = A[low];
  }
  A[low] = A[0];
  if(low == k)
   return A[low];
  else if(low < k)
  {//第k小的元素在枢轴右边
   start = low + 1;
   end = len;
  }
  else
  {//第k小的元素在枢轴左边
   start = 1;
   end = low - 1;
  }
 }while(low != k);
 return 0;
}

 

/*博主寄语:如若发现错误,望指出,谢谢*/

可以使用快速选择算法来找出数组中第 k 个小的元素。 快速选择算法的基本思想是,选择一个基准元素,将数组中小于基准元素元素放在基准元素的左边,将大于基准元素元素放在基准元素的右边,然后比较基准元素的位置和 k 的大小关系,如果基准元素的位置等于 k,就找到了第 k 个小的元素,如果基准元素的位置大于 k,就在基准元素的左边继续查找,如果基准元素的位置小于 k,就在基准元素的右边继续查找。 以下是使用快速选择算法找出数组中第 k 个小的元素的 Python 代码: ```python def quick_select(nums, k): pivot = nums[0] left = [x for x in nums if x < pivot] right = [x for x in nums if x > pivot] mid = [x for x in nums if x == pivot] if k <= len(left): return quick_select(left, k) elif k <= len(left) + len(mid): return pivot else: return quick_select(right, k - len(left) - len(mid)) ``` 在这个函数中,我们首先选择数组中的第一个元素作为基准元素 pivot。然后,我们将数组分成三个部分:小于 pivot 的元素放在 left 数组中,大于 pivot 的元素放在 right 数组中,等于 pivot 的元素放在 mid 数组中。接下来,我们比较基准元素的位置和 k 的大小关系,如果基准元素的位置等于 k,就返回基准元素的值,如果基准元素的位置大于 k,就在 left 数组中继续查找第 k 个小的元素,如果基准元素的位置小于 k,就在 right 数组中继续查找第 k - len(left) - len(mid) 个小的元素。 这个函数的时间复杂度为 O(n),其中 n 是数组的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值