Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么更改随机数生成器会更改C中快速排序的运行时间_C_Quicksort - Fatal编程技术网

为什么更改随机数生成器会更改C中快速排序的运行时间

为什么更改随机数生成器会更改C中快速排序的运行时间,c,quicksort,C,Quicksort,我用C编写了一个快速排序实现。在第一个循环中更改rand函数范围(使用余数)会显著更改算法的运行时间。就目前而言,该算法需要43秒。将范围从100更改为10000可将运行时间减少到0.9秒 为什么呢 #include <stdio.h> #include <time.h> #include <stdlib.h> void quick_sort(int array[], int low, int high); int partition(int array[]

我用C编写了一个快速排序实现。在第一个循环中更改rand函数范围(使用余数)会显著更改算法的运行时间。就目前而言,该算法需要43秒。将范围从100更改为10000可将运行时间减少到0.9秒

为什么呢

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void quick_sort(int array[], int low, int high);
int partition(int array[], int low, int high);
void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}


int main(void)
{
    const int len = 1000000;
    srand(time(NULL));
    int array[len];

    puts("Populating the array...\n");
    for(int i = 0; i < len; i++)
        array[i] = rand() % 100; // Changing this line dramatically reduce the running time

    puts("|Now sorting the array...|\n");

    quick_sort(array, 0, len-1);

    /*for(int i = 0; i < len; i++)*/
        /*printf("%d ", array[i]);*/
}


void quick_sort(int array[], int low, int high)
{
    int j;

    if(low < high)
    {
        j = partition(array, low, high);
        quick_sort(array, low, j-1);
        quick_sort(array, j+1, high);
    }
}

int partition(int array[], int low, int high)
{
    int pivot    = array[high];
    int leftwall = low-1;

    for(int i = low; i < high; i++)
    {
        if(array[i] <= pivot)
        {
            ++leftwall;
            swap(&array[leftwall], &array[i]);
        }
    }

    swap(&array[leftwall+1], &array[high]);

    return ++leftwall;
}
#包括
#包括
#包括
无效快速排序(int数组[],int低,int高);
int分区(int数组[],int低,int高);
无效交换(int*a,int*b)
{
int temp=*a;
*a=*b;
*b=温度;
}
内部主(空)
{
const int len=1000000;
srand(时间(空));
整数数组[len];
puts(“填充数组…\n”);
对于(int i=0;i如果(array[i]我的猜测是,在对数组进行分区时,您最终会移动大量重复值。当您仅从100个选项中选择随机数时,100万个元素的数组中每个值大约有10000个。由于
数组[i],您似乎会在每次调用
partition
时交换它们令我印象深刻的是,您成功地将~4MB的自动VAR塞进了
main()
。相当多的平台中,这些平台本身就会呕吐。原因之一是:不要为了一个微不足道的交换而调用函数。@MAA有两种流行的快速排序算法,一种是您这里使用的简单的“扫描”算法(非常容易编码和理解),另一种是“挤压”算法。您已经知道前者是如何工作的。后者通过取两个标记(高和低)来工作,基本上执行您在这里所做的操作,但在一个过程中在分区的两端。结果通常是交换显著减少,特别是当序列中有大量复制数据时。也许可以查看其他quicksort选项。顺便说一句,
qsort
几乎不只是快速排序。@MAA只需将
swap
操作内联,就可以将慢速操作的执行时间减少三分之一以上。还有一件事。如果这真的是一个严格的[0..99]范围,你最好使用a。对于小的、固定范围的序列,时间几乎是不可能的。我想答案也在这些方面。不过,我对这方面太陌生了,无法确定