分治算法求第k小的元素

分治法思路:

将整个问题分解成若干小问题后再分而治之。如果分解得到的子问题相对来说还是太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生方便求解的子问题,必要时逐步合并这些子问题的解,从而得到问题的解。
分治算法可以由递归过程来表示,因为分治法就是一种找大规模问题与小规模问题关系的方法,是递归设计的一种具体策略。

用分治算法求第k小的数,其本质就是快速排序,不过我们只需要排一半。

通过快速排序,我们可以得到本次的数在整个数组的第几位,再与要求的k进行比较,直到本次快排的中轴数的位置与k相等,就可以得到结果。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <time.h>

int keyword[51];
int k = 10; //2100301710 学号后两位10
void half_quick_Sort(int arr[], int left, int right, int k);
int PartSort(int arr[], int left, int right);
void swap(int i, int j);

int main() {
	int i, j;
	for (i = 1; i <= 50; i++) {
		keyword[i] = rand() % 100;
	}

	for (i = 1; i <= 50; i++) {
		printf("%2d ", keyword[i]);
		if (i % 10 == 0) {
			printf("\n");
		}
	}

	int left = 1, right = 50;
	half_quick_Sort(keyword, left, right, k);
	printf("\n第%d小的数为:%d\n", k, keyword[k]);

	
}

void half_quick_Sort(int arr[], int left, int right, int k) {
	if (left < right) {
		int piovt = PartSort(arr,left,right);
		if (piovt == k) {
			return;
		}
		else if (piovt < k) {
			half_quick_Sort(arr, piovt + 1, right, k);
		}
		else {
			half_quick_Sort(arr, left, piovt - 1, k);
		}

	}
}

int PartSort(int a[], int left, int right) {
	int pivot = left;
	while (left < right)
	{
		while (left < right && a[right] >= a[pivot])//如果右比key小就退出循环
			right--;
		while (left < right && a[left] <= a[pivot])//如果左比key大就退出循环
			left++;
		swap(left, right);//交换左右
	}
	swap(pivot, left);//交换key和相遇位置的元素
	return left;//返回key的位置
}

void swap(int i, int j) {
	int temp;
	temp = keyword[i];
	keyword[i] = keyword[j];
	keyword[j] = temp;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值