十大排序算法——計數排序(C語言)

計數排序(適用於在一定範圍內的整數排序,取值範圍不是很大的情況下,效率快過時間複雜度爲O(nlogn)的排序)

計數排序是一個非基於比較的排序算法,該算法於1954年由 Harold H. Seward 提出。它的優勢在於在對一定範圍內的整數排序時,它的複雜度爲Ο(n+k)(其中k是整數的範圍),快於任何比較排序算法。

基本思想

首先根據原數組的大小創建一個相同的新數組,用於存放原數組中計數完畢的數據;對於一個待排序序列中的元素X,計算待排序序列中比X小的數,假如有A個,就把X放在新數組的第A個下標的位置上,依次計算第二個,第三個等等的數據,直到原數組的數據全部計數完畢,就得到了一個排序完成的新數組,在把新數組的數據全部賦值給原數組。

代碼實現

#include<stdio.h>
#include<stdlib.h>

#define MAXNUM 80

//計數排序法
void Count_Sort(int a[],int n)
{
    int i,j,count,*data;
    data = (int *)malloc(sizeof(int)*n);   //動態分配內存空間
    for ( i = 0; i < n; i++)  //初始化data爲0
    {
        data[i] = 0;
    }
    for ( i = 0; i < n; i++)
    {
        count = 0;     //計數值
        for ( j = 0; j < n; j++)  //掃描待排序數組
        {
            if (a[j] < a[i])  //統計比a[i]值小的值的個數
            {
                count++;
            }
            
        }
        while (data[count] != 0)//對於相等非0的數據,應向後措一位。數據爲0時,因數組data被初始化爲0,故不受影響。
        /* 注意此處應使用while循環進行判斷,若用if條件則超過三個重複值後有0出現 */   
        {
            count++;
        }
        data[count] = a[i];  //把計數完畢的數據存放到data中的對應位置
        
    }
    for ( i = 0; i < n; i++)  //把排序完的數據複製到a中
    {
        a[i] = data[i];
    }
    free(data);  //釋放data
    data = NULL;
    
    
}
void main()
{
    int i;
    /* int a[MAXNUM];
    printf("請輸入十個待排序數據");
    for (int j = 0; j < MAXNUM; j++)
    {
        scanf("%d",&a[j]);
    } */
    int a[MAXNUM]={12,23,69,65,45,23,69,56,85,4212,23,69,65,45,23,69,56,85,42,12,23,69,65,45,23,69,56,85,4212,23,69,65,45,23,69,56,85,42,23,56,12,23,69,65,45,23,69,56,85,4212,23,69,65,45,23,69,56,85,42,12,23,69,65,45,23,69,56,85,4212,23,69,65,45,23,69,56,85,42,23,56};
    Count_Sort(a,MAXNUM);
    for ( i = 0; i < MAXNUM; i++)
    {
        printf("%d ",a[i]);
    }
    system("pause");   //防止控制檯閃退
}

參考文獻
漫畫:什麼是計數排序?
百度百科

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章