C語言:十種排序(八) - 計(jì)數(shù)排序

前言

一種將無序數(shù)組進(jìn)行排序的方法。

計(jì)數(shù)排序,wiki參考:
https://zh.wikipedia.org/wiki/%E8%AE%A1%E6%95%B0%E6%8E%92%E5%BA%8F

計(jì)數(shù)排序,主要思想:

  1. 引入臨時(shí)數(shù)組。
  2. 對(duì)于元素i,計(jì)算出比i小的數(shù),從而確定i的位置。
  3. 計(jì)算i的重復(fù),填充數(shù)組。

環(huán)境

編輯器:vs2019
文件:.c類型

正文

代碼參考:

#include <stdio.h>

// 計(jì)數(shù)排序,
// 1. 引入臨時(shí)數(shù)組。
// 2. 對(duì)于元素i,計(jì)算出比i小的數(shù),從而確定i的位置。
// 3. 計(jì)算i的重復(fù),填充數(shù)組。 


void count_sort_normal(int source_array[], int source_array_length)
{
    int i, j, k;

    // 定義臨時(shí)數(shù)組,并且初始值為0
    int* tmp_group = (int*)calloc(sizeof(int) * source_array_length);

    // 目標(biāo)元素在有序數(shù)組中的索引
    int target_index;

    // 目標(biāo)元素的重復(fù)數(shù)
    int target_num;

    for (i = 0; i < source_array_length; i++)
    {
        target_index = 0;
        target_num = 0;

        for (j = 0; j < source_array_length; j++)
        {
            // 遍歷得出目標(biāo)元素的索引
            if (source_array[j] < source_array[i])
            {
                target_index++;
            }
            else
            {
                // 計(jì)算重復(fù)數(shù)
                if (source_array[j] == source_array[i])
                {
                    target_num++;
                }
            }
        }
        // 對(duì)臨時(shí)數(shù)組填充。當(dāng)臨時(shí)數(shù)組中的值為0時(shí),說明未填充。當(dāng)前元素為0時(shí),無需填充。
        if (tmp_group[target_index] == 0 && source_array[i] !=0 )
        {
            // 根據(jù)重復(fù)數(shù)填充
            for (k = 1; k <= target_num; k++)
            {
                tmp_group[target_index] = source_array[i];
                target_index++;
            }
        }
    }


    // 將原數(shù)組替換
    for (i = 0; i < source_array_length; i++)
    {
        source_array[i] = tmp_group[i];
    }
}


int main()
{
    // 生成隨機(jī)測(cè)試列表
    int test_list[20];
    int test_list_length = sizeof(test_list) / sizeof(int);

    printf("測(cè)試列表: \n");
    for (int i = 0; i < test_list_length; i++)
    {
        test_list[i] = rand() % 100;
        printf("%d ", test_list[i]);
    }
    printf("\n");

    // 普通計(jì)數(shù)排序
    count_sort_normal(test_list, test_list_length);
    printf("普通計(jì)數(shù)排序結(jié)果: \n");
    for (int i = 0; i < test_list_length; i++)
    {
        printf("%d ", test_list[i]);
    }
    printf("\n");

    return 0;
}

執(zhí)行結(jié)果參考:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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