分治法java找第k大的数_求数组中第k大的数(分治法)

本文介绍了如何运用快速排序的思想,通过分治法在Java中寻找数组中的第k大元素。核心算法是PartSort函数,它通过调整数组元素来定位第k大数的正确位置,然后在循环中不断调整范围,直到找到目标位置。这种方法能有效找出数组的第k大数,并在示例代码中进行了验证。
摘要由CSDN通过智能技术生成

思想:快排

因为单趟排序是使选定的king值到其应该到的位置,所以每次判断这个king的正确位置是否是第K大数的位置即可

#include 

using namespace std;

//快排中的单趟排序

int PartSort(int* arr,int start,int end)

{

int first = start;

int last = end;

int tmp = arr[first];

int key = first;

while (first 

while (first=tmp){

--last;

}

if (first 

arr[first] = arr[last];

key = last;

}

while (first 

++first;

}

if (first 

arr[last] = arr[first];

key = first;

}

arr[first] = tmp;

}

return key;

}

//循环判断是否找到了第K大数对应的下标位置

int quickly(int* arr,int start,int end,int k,int size)

{

int ret=PartSort(arr, start, end);

while (ret != size-k){

if (ret > size-k){

end = ret - 1;

ret = PartSort(arr, start,end);

}

else{

start = ret + 1;

ret = PartSort(arr,ret+1,end);

}

}

return arr[ret];

}

int kNumOfArr(int* arr,int size,int k)

{

//判断参数有效性

if (arr == NULL || size <= 0 || k <= 0 || k > size)

return -1;

return  quickly(arr, 0, size - 1, k, size);

}

int main()

{

int arr[] = { 5, 8, 100, 6, 7, 1, 6, 0 };

for (int k = 1; k <= 8; ++k){

int ret = kNumOfArr(arr, sizeof(arr) / sizeof(arr[0]), k);

cout <

}

system("pause");

return 0;

}

《完》

本文出自 “零蛋蛋” 博客,谢绝转载!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值