找第j小元素(递归实现)

//该程序只能实现互异元素的查找
#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#define swap(x, temp, y) (temp = x, x = y, y = temp)

//找到[p,r]之间坐标z+1,左边全小于该坐标处值,右边大于等于该坐标处值
int random_partition(int a[], int p, int r)
{
	int q, i, temp,
		z = p - 1;
	srand(time(NULL));
	q = rand()%(r - p + 1) + p;//随机产生[p,r]区间上一元素
	swap(a[q], temp, a[r]);
	for(i = p; i < r; i++)
	{
		if(a[i] < a[r])
		{
			z++;
			swap(a[z], temp, a[i]);
		}
	}
	swap(a[r], temp, a[z + 1]);
	return z + 1;
}

//找第j小元素
int random_select(int a[], int p, int r, int j)
{
	int q, k;
	if(p == r)
	{
		return a[p];
	}

	q = random_partition(a, p, r);

	k = q - p + 1;
	if(j == k)
	{
		return a[q];
	}
	else if(j < k)
	{
		return random_select(a, p, q - 1, j);
	}
	else
	{
		return random_select(a, q + 1, r, j - k);
	}
}

int main(void)
{
	int i, j, n, a[111], j_min;
	scanf("%d", &n);
	for(i = 1; i <= n; i++) 
	{
		scanf("%d", &a[i]);
	}
	scanf("%d", &j);

	j_min = random_select(a, 1, n, j);

	printf("%d\n", j_min);
	system("pause");
}

     
     
    
    
   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用快速选择算法来出数组中第 k 个小的元素。 快速选择算法的思路类似于快速排序,不同的是在每次划分数组时只需要对包含第 k 个元素的那一边进行递归即可。具体实现可以参考下面的代码: ```python def quick_select(nums, left, right, k): if left == right: return nums[left] pivot = partition(nums, left, right) if k == pivot: return nums[k] elif k < pivot: return quick_select(nums, left, pivot - 1, k) else: return quick_select(nums, pivot + 1, right, k) def partition(nums, left, right): pivot = nums[right] i = left - 1 for j in range(left, right): if nums[j] < pivot: i += 1 nums[i], nums[j] = nums[j], nums[i] nums[i+1], nums[right] = nums[right], nums[i+1] return i+1 ``` 其中,`quick_select` 函数的参数包括数组 `nums`、左右边界 `left` 和 `right`,以及要查找的第 k 个小元素的下标 `k`。首先在数组中选取一个枢纽元素(这里选取最右侧的元素),然后将数组划分为左右两部分,使得左边的元素都小于等于枢纽元素,右边的元素都大于等于枢纽元素。如果枢纽元素的下标等于 k,则到了第 k 个小的元素,返回该元素的值;否则,根据枢纽元素的下标和 k 的大小关系,递归调用 `quick_select` 函数继续查找。 `partition` 函数实现了划分数组的过程,具体思路是维护一个指针 i,表示当前已经处理好的小于枢纽元素元素的最右侧位置,初始值为 left-1。然后依次遍历数组中的元素,如果发现一个小于枢纽元素元素,就将它与指针 i+1 所在位置的元素交换,并将指针 i 向右移动一位。最后将枢纽元素放到指针 i+1 所在位置即可。最终返回指针 i+1 的值,即枢纽元素的下标。 使用快速选择算法的时间复杂度为 O(n),因为每次划分数组的时间复杂度为 O(n),而每次递归只会对一个子数组进行操作,因此总时间复杂度为 O(n)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值