【发布时间】:2019-04-20 01:35:58
【问题描述】:
我希望实现一个非常简单的函数,它通过计算较小元素的数量和较大元素的数量来找到未排序数组的中值,如果它们的数量相等,那么原始元素被视为中值。
我知道一些算法,比如 minHeap 和 Quick Select,但我试图让事情变得简单,就像人类用肉眼简单地计算越来越大的数字一样。到目前为止,我已经实现了下面的函数,但是当我在数组中有重复的条目并且数组长度为偶数和奇数时会出现问题。
我是 C 编程新手,需要了解问题所在。下面是代码,我写了一个函数来返回可变长度的随机数组来测试这个函数。
int med(int count, int *array)
{
int i, j, median = -1, smaller = 0, larger = 0;
for(i = 0; i < count; i++)
{
for(j = 0; j < count; j++)
{
//larger++
if(array[i] < array[j] && i!=j)
{
larger++;
}
//Smaller++
if(array[i] >= array[j] && i!=j)
{
smaller++;
}
}
printf("\nFor pivot: %d", array[i]);
if(larger == smaller)
{
printf("\n Smaller: %d", smaller);
printf(" Larger: %d", larger);
median = array[i];
break;
}
else
{
printf("\n Smaller: %d", smaller);
printf(" Larger: %d", larger);
larger = 0;
smaller = 0;
}
}
return median;
}
在某些情况下,例如 {3,5,0,2,3},我的函数返回 -1,但实际结果应该是 3。
编辑 最初我从严格的更大或更小开始,但是当我有重复的条目时,这个条件(更大==更小)永远不会受到影响,因此我认为相等的元素更小。我在处理平等方面有困难
【问题讨论】:
-
有什么理由要避免对其进行排序吗?
-
它开始看起来像XY-problem 但你让我很好奇。这种新的排序算法的目的是什么?
-
肯定不是xy问题!我确实知道有多种方法可以做到这一点,因为我提到了其中两种方法,而您在答案中给出了一种方法。我只是从人类如何在给定 4,5 个数字的情况下找到中位数(如果较小的数量等于较大的数量,则为每个元素计数)来思考它,你就拥有了!新算法也是我想出来的,在网上找不到,为什么不试试呢!
-
但是使用 O(n²) 的中值函数创建排序算法的目的是什么?如果你很好地实现排序,那么排序算法将是 O(n²log n),但这甚至比冒泡排序和选择排序等最简单的排序还要糟糕。如果你使用简单的排序实现,它将是 O(n³)
-
我明白这一点,而且我总是可以证明找到中位数的方法。但首先,这是我的方法,我被困住了。有很多解决方法,但为什么要选择一种而不试图克服这个问题?
标签: c