随机数组排序10,000,000

时间:2017-10-02 15:35:53

标签: c arrays

我必须对数组进行排序,但我遇到了问题:

所以,我做了这个:

#define size 10000000

int main() {
int arr[size], i, j;
int aux = 0;
int num;`

srand(time(NULL));

for (i = 0; i < size; i ++)
{
       num = rand() % size + 1;
       arr[i] = num;
}

for(i = 0; i < size; i++)
{

    for (j = 0; j < size-1; j++)
    {
        if (arr[j] > arr[j+1])
        {
            aux = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = aux;
        }
    }
}

for (i = 0; i < size; i++)
{
    printf("%d\n",arr[i]);
}

return 0; }

最有效的方法是什么?快速排序?我该怎么办?请提前帮助。

2 个答案:

答案 0 :(得分:1)

考虑到输入的大小,可以说很清楚。

10 ^ 7输入在使用冒泡排序平均排序时需要进行10 ^ 14次比较。现在,在标准机器中几乎可以在1秒内完成10 ^ 8次比较。所以这需要很长时间。(冒泡排序是O(n^2)

您必须寻找一些O(nlogn)算法。 (以获得最佳的空间和时间复杂度)。也许快速排序或合并排序或堆垛。

在这个位置,最好的做一个快速排序。它不像mergesort或heapsort那样具有空间复杂性。 因此,在这种情况下,它将是最有效的解决方案。

正如评论中提到的,Heapsort也可以在没有额外内存的情况下完成,因为avergae的复杂性将nlogn(theta nlogn)所以在这种情况下,heapsort可能是一个不错的选择。 Lee Daniel Crocker 在评论中提到了这一点。

为了摆脱堆栈溢出, Eugene 表示你可以将main标记为static或使数组全局化。这将使它不是堆栈的一部分。另外正如您所提到的,使用动态内存分配是另一种选择。尝试在malloc()内分配(free)和main()

为了进一步澄清最坏情况,由于调用堆栈中的堆栈帧,快速排序的空间复杂度大约为nlogn。对于堆排序,它不会被重新获得。

答案 1 :(得分:0)

  

最有效的方法是什么?

OP使用for(i = 0; i < size; i++) { for (j = 0; j < size-1; j++)运行时间为O(N*N)

OP可以利用这不是一般的排序,(使用qsort() - 通常是O(N*log2N()),但是N值的数组,其值在[1 .. .N]。

相反:(类似于@BLUEPIXY评论)。

给定代码的数组A N元素范围为[1 ... N]

创建B个元素的腋窝数组N,用0初始化。

通过A B记录每个值的出现次数(偏移​​1),然后进行1次传递。

通过B进行1次传递,并按值发生的次数填充A

结果: O(N) - 快得多。使用了2x内存。

实施例

N = 10
A[] { 8 7 6 8 7 6 5 3 10 9 }
B[] { 0 0 1 0 1 2 2 2 1 1 } // 3 occurs once, 6 occurs twice
A[] { 3 5 6 6 7 7 8 8 9 10 }

实施说明

对于语言环境变量,

int arr[size]可能会超出平台的内存。考虑分配内存(或弱第二选择:使用全局)。 @ Eugene Sh.