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

时间:2016-04-16 18:36:39

标签: 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[], 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;
}

1 个答案:

答案 0 :(得分:1)

我的猜测是,在对数组进行分区时,最终会移动大量重复值。当您从100个选项中选择随机数时,一百万个元素的数组将具有大约10,000个每个值。由于partition比较,您似乎会在每次调用array[i] <= pivot时交换它们。例如,当你差不多完成并且分区中只有两个不同的值时,它仍然有大约20,000个元素......