计数算法排序实现

计数排序的核心思想是:
1 以待排序的数作为count序列的下标,以该下标出现的次数作为值。
2 线性的检测count序列的不为0的项,将此项的值 放在result序列的当前index下标项中,count序列中该计数减一。

代码实现如下:

int GetMaxValue(int* array,int length)
{
       int maxValue = array[0];
       for(int i =1;i < length;i++)
       {
              if(maxValue < array[i])
              {
                     maxValue = array[i];
              }
       }

       return maxValue;
}

int GetMinValue(int* array,int length)
{
       int minValue = array[0];
       for(int i =1;i < length;i++)
       {
              if(minValue > array[i])
              {
                     minValue = array[i];
              }
       }

       return minValue;
}

void CountSoft(int* array,int length)
{
       int maxValue = GetMaxValue(array,length);
       int minValue = GetMinValue(array,length);

       int* count = new int[maxValue + 1];
       memset(count,0,sizeof(int) * (maxValue + 1));

       for(int i = 0;i < length;i++)
       {
              //计数
              ++count[array[i]];
       }

       int index = 0;
       for(int i = minValue;i < maxValue + 1;i++)
       {
              for (int j = count[i];j > 0;j--)
              {
                     array[index++] = i;
              }
       }
       delete[] count;
}
int main() {
    int array[] = {12,31,1,21,11,3,89,56,14,89,10};
    int length = sizeof(array) / sizeof(array[0]);
    CountSoft(array,length);
    std::for_each(array,array+length,[](int i){
        
        std:: cout << i << " ";
    });
    
    std::cout << std::endl;
	cout  << "test\n";
	return 0;
}

计数排序使用了一个技巧 就是利用 count 以array[i] 做下标,这样就造成了自然有序。
计数排序的时间复杂度为:O(n+k) n为数组的长度,k为数组的范围大小 k = maxValue - minValue
计数排序的时间复杂度主要取决于 k(范围),范围越大,排序效率越低。
计数排序适合于范围幅度较小的序列排序。

上一篇:0-1背包问题


下一篇:MaxCompute执行引擎核心技术DAG揭秘