ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

计数算法排序实现

2021-07-13 18:59:14  阅读:185  来源: 互联网

标签:count int length maxValue 计数 算法 array 排序 minValue


计数排序的核心思想是:
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(范围),范围越大,排序效率越低。
计数排序适合于范围幅度较小的序列排序。

标签:count,int,length,maxValue,计数,算法,array,排序,minValue
来源: https://blog.csdn.net/qq_25160759/article/details/118708082

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有