国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

詳解計(jì)數(shù)排序算法及C語言程序中的實(shí)現(xiàn)

2020-01-26 14:31:29
字體:
供稿:網(wǎng)友

關(guān)于計(jì)數(shù)排序算法

當(dāng)輸入的元素是 n 個 0 到 k 之間的整數(shù)時,它的運(yùn)行時間是 Θ(n + k)。計(jì)數(shù)排序不是比較排序,排序的速度快于任何比較排序算法。

由于用來計(jì)數(shù)的數(shù)組C的長度取決于待排序數(shù)組中數(shù)據(jù)的范圍(等于待排序數(shù)組的最大值與最小值的差加上1),這使得計(jì)數(shù)排序?qū)τ跀?shù)據(jù)范圍很大的數(shù)組,需要大量內(nèi)存。計(jì)數(shù)排序是用來排序0到100之間的數(shù)字的最好的算法,但是它不適合按字母順序排序人名。但是,計(jì)數(shù)排序可以用在基數(shù)排序中的算法來排序數(shù)據(jù)范圍很大的數(shù)組。

算法的步驟如下:

  • 找出待排序的數(shù)組中最大和最小的元素
  • 統(tǒng)計(jì)數(shù)組中每個值為i的元素出現(xiàn)的次數(shù),存入數(shù)組C的第i項(xiàng)
  • 對所有的計(jì)數(shù)累加(從C中的第一個元素開始,每一項(xiàng)和前一項(xiàng)相加)
  • 反向填充目標(biāo)數(shù)組:將每個元素i放在新數(shù)組的第C(i)項(xiàng),每放一個元素就將C(i)減去1

代碼示例:

#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>using namespace std;void CountingSort(int *A,int *B,int *Order,int N,int K){  int *C=new int[K+1];  int i;  memset(C,0,sizeof(int)*(K+1));  for (i=1;i<=N;i++) //把A中的每個元素分配    C[A[i]]++;  for (i=2;i<=K;i++) //統(tǒng)計(jì)不大于i的元素的個數(shù)    C[i]+=C[i-1];  for (i=N;i>=1;i--)  {    B[C[A[i]]]=A[i]; //按照統(tǒng)計(jì)的位置,將值輸出到B中,將順序輸出到Order中    Order[C[A[i]]]=i;    C[A[i]]--;  }}int main(){  int *A,*B,*Order,N=15,K=10,i;  A=new int[N+1];  B=new int[N+1];  Order=new int[N+1];  for (i=1;i<=N;i++)    A[i]=rand()%K+1; //生成1..K的隨機(jī)數(shù)  printf("Before CS:/n");  for (i=1;i<=N;i++)    printf("%d ",A[i]);  CountingSort(A,B,Order,N,K);  printf("/nAfter CS:/n");  for (i=1;i<=N;i++)    printf("%d ",B[i]);  printf("/nOrder:/n");  for (i=1;i<=N;i++)    printf("%d ",Order[i]);  return 0;}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 泰安市| 洪泽县| 汾西县| 绵竹市| 宝清县| 泸定县| 册亨县| 昌乐县| 西盟| 铅山县| 庆阳市| 梁山县| 昆明市| 沈丘县| 綦江县| 棋牌| 基隆市| 娄烦县| 冕宁县| 桐庐县| 阜阳市| 上虞市| 宜君县| 铜梁县| 通榆县| 皮山县| 遂溪县| 苏尼特右旗| 八宿县| 蚌埠市| 沙湾县| 闸北区| 长顺县| 彭山县| 闵行区| 静海县| 板桥市| 苍梧县| 湘潭市| 彭泽县| 沁水县|