3

所以我几天前刚开始用 C 编程,我有这个程序,它接受一个充满整数的未排序文件,使用快速排序 第一算法对其进行排序

关于我在这方面做错了什么有什么建议吗?

4

3 回答 3

5

从您所描述的情况来看,听起来您快到了。您正在尝试获取集合的第一个元素,该元素的值等于(或仅大于)该集合所有其他成员的 90%。你已经完成了排序。其余的应该简单地遵循这些步骤(如果我理解你的问题):

1)将集合排序到一个数组中(我认为你已经这样做了)
2)计数集合中的数字,存储在float n; //集合中元素的数量
3)通过排序数组索引到第 0.9*n 个元素,(选择超过该点的第一个不是上一个的重复)
4)显示结果

这是我所描述的实现(有点,我没有存储n):(忽略随机数生成器等,这只是获取数组的快速方法)

#include <ansi_c.h>
#include <windows.h>
int randomGenerator(int min, int max);
int NotUsedRecently (int number);
int cmpfunc (const void * a, const void * b);

int main(void)
{
    int array[1000];
    int i;

    for(i=0;i<1000;i++)
    {
        array[i]=randomGenerator(1, 1000);
        Sleep(1);
    }

    //sort array
    qsort(array, 1000, sizeof(int), cmpfunc);

    //pick the first non repeat 90th percent and print
    for(i=900;i<999;i++)
    {
        if(array[i+1] != array[i])
        {
            printf("this is the first number meeting criteria: %d", array[i+1]);
            break;
        }
    }
    getchar();  

    return 0;
}






int cmpfunc (const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}


int randomGenerator(int min, int max)
{
    int random=0, trying=0;

    trying = 1;         
    srand(clock());
    while(trying)
    {

        random = (rand()/32767.0)*(max+1);
        (random >= min) ? (trying = 0) : (trying = 1);
    }

    return random;
}

这是我的第一个随机生成的数组(以第 90 个百分位为中心)的输出,与算法选择的内容进行比较:左侧的列是元素编号,右侧是随机生成的整数的排序列表。(注意它会跳过重复以确保最小值超过90%)

在此处输入图像描述 在此处输入图像描述

总结:正如我所说,我认为你已经,几乎在那里。请注意我的代码的这一部分与您的代码有多么相似:

在此处输入图像描述

你已经有了一些非常相似的东西。只需修改它以开始查看数组的 90% 索引(无论是什么),然后只需选择第一个不等于前一个的值。

于 2013-11-14T17:02:29.640 回答
1

根据这部分:

int output = array[(int)(floor(0.9*count)) + 1];
int x = (floor(0.9*count) + 1);

while (array[x] == array[x + 1])
{
    x = x + 1;
}
printf(" %d ", output);  

在您不检查是否x已超过count...时(如果所有前 10% 的数字都相等怎么办?)您output在第一行设置并在最后打印,但同时不要对其进行任何操作。(所以中间的所有这些线什么都不做)。

你肯定是在正确的轨道上。

于 2013-11-14T17:08:38.993 回答
1

代码中的一个问题是,一旦找到输出,您的第二种算法就需要一个中断案例。此外,您不能在 for 循环中声明变量,除非在某些情况下。我不确定你是如何编译它的。

于 2013-11-14T17:12:16.910 回答