Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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++,编写了这个算法,我想知道是否有更快的方法来做同样的事情。这是假设输入是有效的。我曾试图考虑如何删除嵌套的for循环,但认为它是好的,因为它不是指数型的。这是正确的吗?谢谢 void DigitSort(int* arr, int size) { int counts[10] = { 0,0,0,0,0,0,0,0,0,0 }; int k = -1; while (++k < size) counts[arr[k]]++; k = -1; for (int j = 0; j < 10; ++j) for (int i = 0; i < counts[j]; ++i) arr[++k] = j; } void DigitSort(int*arr,int size) { 整数计数[10]={0,0,0,0,0,0,0,0,0}; int k=-1; 而(++k_C++_Optimization - Fatal编程技术网

这是最快的一位数排序算法吗? 我正在努力学习C++,编写了这个算法,我想知道是否有更快的方法来做同样的事情。这是假设输入是有效的。我曾试图考虑如何删除嵌套的for循环,但认为它是好的,因为它不是指数型的。这是正确的吗?谢谢 void DigitSort(int* arr, int size) { int counts[10] = { 0,0,0,0,0,0,0,0,0,0 }; int k = -1; while (++k < size) counts[arr[k]]++; k = -1; for (int j = 0; j < 10; ++j) for (int i = 0; i < counts[j]; ++i) arr[++k] = j; } void DigitSort(int*arr,int size) { 整数计数[10]={0,0,0,0,0,0,0,0,0}; int k=-1; 而(++k

这是最快的一位数排序算法吗? 我正在努力学习C++,编写了这个算法,我想知道是否有更快的方法来做同样的事情。这是假设输入是有效的。我曾试图考虑如何删除嵌套的for循环,但认为它是好的,因为它不是指数型的。这是正确的吗?谢谢 void DigitSort(int* arr, int size) { int counts[10] = { 0,0,0,0,0,0,0,0,0,0 }; int k = -1; while (++k < size) counts[arr[k]]++; k = -1; for (int j = 0; j < 10; ++j) for (int i = 0; i < counts[j]; ++i) arr[++k] = j; } void DigitSort(int*arr,int size) { 整数计数[10]={0,0,0,0,0,0,0,0,0}; int k=-1; 而(++k,c++,optimization,C++,Optimization,没有基准测试,但这里有一个(可能)更快的解决方案,使用std::fill\n void DigitSort(int* arr, int size) { int counts[10] = { 0,0,0,0,0,0,0,0,0,0 }; int k = -1, sum_count = 0; while (++k < size) counts[arr[k]]++; for (k = 0; k < 10; ++k) {

没有基准测试,但这里有一个(可能)更快的解决方案,使用std::fill\n

void DigitSort(int* arr, int size)
{
    int counts[10] = { 0,0,0,0,0,0,0,0,0,0 };
    int k = -1, sum_count = 0;
    while (++k < size)
        counts[arr[k]]++;
    
    for (k = 0; k < 10; ++k) {
        std::fill_n(arr + sum_count, counts[k], k);
        sum_count += counts[k];
    }
}
void DigitSort(int*arr,int size)
{
整数计数[10]={0,0,0,0,0,0,0,0,0};
int k=-1,和计数=0;
而(++k<大小)
计数[arr[k]]++;
对于(k=0;k<10;++k){
std::fill_n(arr+sum_count,counts[k],k);
sum_count+=计数[k];
}
}

当我说“可能”时,是因为编译器可以优化指令的std::fill\n。

嵌套循环仍然是
O(n)
总的来说,你不能得到比
O(n)更好的结果。
看起来你在试着做一件事:只有当大小远远大于10时,你才会考虑效率问题。在这种情况下,一种可能是使用
count[]
数组作为排序数组的特定表示形式。对于
counts
和索引,我将使用
std::size\u t
。但除此之外,代码似乎还可以。虽然只有在机器具有分段内存架构时,才能看到性能提升,但可以使用reduce操作并行计算总和。例如,如果您以GPU为目标,答案可能会大不相同。请看:我的意思是,我没有对运行时间进行比较测试。顺便说一下,我刚刚将代码从memset改为std:fill。为什么您希望
std::fill
更快?(我并不是说不是,但如果没有可用的衡量标准,答案可能会受益于这一说法的基本原理)。