計(jì)數(shù)排序

思想:計(jì)數(shù)排序其實(shí)是桶排序的一種特殊情況。所處排序范圍是固定的,比如最大值是 k,我們就可以把數(shù)據(jù)劃分成 k 個(gè)桶。每個(gè)桶內(nèi)的數(shù)據(jù)值都是相同的,省掉了桶內(nèi)排序的時(shí)間。這里的k是小于數(shù)據(jù)總數(shù)的。

代碼實(shí)現(xiàn)

// 計(jì)數(shù)排序
void countSort(int a[], int n) {
    if (n <= 1) {
        return;
    }
    
    // 求解最大值
    int max = a[0];
    for(int i = 1; i < n; i++) {
        if (max < a[i]) {
            max = a[i];
        }
    }
    
    // 初始化數(shù)組, 用來計(jì)數(shù)
    int c[max];
    for (int i = 0; i <= max; i++) {
        c[i] = 0;
    }
    
    // 開始計(jì)數(shù), 計(jì)算每個(gè)桶內(nèi)的個(gè)數(shù)
    for (int i = 0; i < n; i++) {
        c[a[i]]++;
    }
    
    // 依次做累加, 實(shí)現(xiàn)排序
    for (int i = 1; i <= max; i++) {
        c[i] = c[i - 1] + c[i];
    }
    
    // 臨時(shí)數(shù)組, 用來排序
    int r[n];
    for (int i = n - 1; i >= 0; i--) {
        int index = c[a[i]] - 1;
        r[index] = a[i];
        c[a[i]]--;
    }
    
    // 將臨時(shí)數(shù)組值, 賦值給原始數(shù)組
    for (int i = 0; i < n; i++) {
        a[i] = r[i];
    }
}

使用

int a[] = {2, 5, 3, 0, 2, 3, 0 ,3};
    int num = sizeof(a) / sizeof(int);
    countSort(a, num);
    
    for (int i = 0; i < num; i++) {
        printf("%d\n", a[i]);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容