C语言分治法寻找第k大数字,求数组中第k大的数(分治法)

思想:快排

因为单趟排序是使选定的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;

}

《完》

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值