无序数字中位数_求一个无序数组的中位数

求一个无序数组的中位数

中位数是将数组排序之后,数组个数为奇数时,取中间的即为中位数;数组个数为偶数时,取中间两个的平均值即为中位数。

思路一:

要取得中位数,即给数组排序,使用任意排序算法均可,然后按数组下标取其中位数。

PS:该方法很直观,此处不实现

思路二:

1.设数组元素为n个,且为奇数个时,取数组前(n+1)/2个元素建一个小堆

2.遍历数组剩余元素,如果比堆顶元素大即入堆,如果比堆顶元素小或等于堆顶元素,即舍弃,不入堆

3.遍历完数组元素时,堆顶即为中位数

PS:此处要使用STL中的优先级队列,博主需要见缝插针的介绍一下优先级队列

优先级队列:

优先队列不遵循队列先进先出的规则,而是根据队列中元素的优先权,优先权最大的先被取出。

优先级队列使用方法:

头文件:   #include

声明方式:

1.普通声明:

priority_queue  tty;

这个是使用STL里默认的排列顺序,即从大到小排列,建大堆

2.自定义优先级:

struct compare

{

bool operator()(int x, int y)

{

return x > y; //x,小的优先级高

}

};

代码实现:

#include

#include

#include

#include

#include

using namespace std;

struct compare

{

bool operator()(int x, int y)

{

return x > y;   //x,小的优先级高

}

};

void HeapSort(int* arr, int len)

{

assert(arr);

int newlen = (len + 1) / 2;     //用数组的一半多1长度建堆

priority_queue, compare> tty;    //建小堆

for (int i = 0; i < newlen;i++)

{

tty.push(arr[i]);

}

//此时数组中一半+1的元素已经建成小堆,需要比较数组后面元素

for (int j = newlen; j < len; ++j)

{

//拿数组后半部分依次和堆顶比较,大于堆顶时入堆

if (arr[j]>tty.top())

{

tty.pop();    //要保持堆内元素个数不变

tty.push(arr[j]);

}

}

if (!tty.empty())

{

cout <

}

cout << endl;

}

void TestHeapSort()

{

int arr[] = { 58, 99, 66, 34, 21, 2, 0, 8, 7, 6, 5, 222222, 111, 888, 3 };

int len = sizeof(arr) / sizeof(arr[0]);

HeapSort(arr, len);

}

int main()

{

TestHeapSort();

system("pause");

return 0;

}

579e437ca69dca5d5b79501f0f0307ea.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,可以使用PriorityQueue来实现无序数组中位数。PriorityQueue是一个基于优先级堆的无界优先级队列,默认是一个最小堆。具体实现可以参考以下代码: ``` import java.util.PriorityQueue; public class Median { public static double median(int[] array) { int heapSize = array.length / 2 + 1; PriorityQueue<Integer> heap = new PriorityQueue<>(heapSize); for (int i = 0; i < heapSize; i++) { heap.add(array[i]); } for (int i = heapSize; i < array.length; i++) { if (heap.peek() < array[i]) { heap.poll(); heap.add(array[i]); } } if (array.length % 2 == 1) { return (double) heap.peek(); } else { return (double) (heap在Java中,可以使用PriorityQueue来实现无序数组中位数。PriorityQueue是一个基于优先级堆的无界优先级队列,默认是一个最小堆。具体实现可以参考以下代码: ``` import java.util.PriorityQueue; public class Median { public static double median(int[] array) { int heapSize = array.length / 2 + 1; PriorityQueue<Integer> heap = new PriorityQueue<>(heapSize); for (int i = 0; i < heapSize; i++) { heap.add(array[i]); } for (int i = heapSize; i < array.length; i++) { if (heap.peek() < array[i]) { heap.poll(); heap.add(array[i]); } } if (array.length % 2 == 1) { return (double) heap.peek(); } else { return (double) (heap.poll() + heap.peek()) / 2.0; } } public static void main(String[] args) { int[] array = new int[]{12, 34, 1, 209, 17, 900, -10}; System.out.println(median(array)); } } ``` 其中,首先定义了一个大小为数组长度一半加一的最小堆,然后将数组的前一半元素加入堆中。接着,遍历数组的后一半元素,如果当前元素比堆顶元素大,则将堆顶元素弹出,将当前元素加入堆中。最后,如果数组长度奇数,则中位数就是堆顶元素;如果数组长度为偶数,则中位数就是堆顶元素和次顶元素的平均值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值