數據結構-計數排序

計數排序算法沒有用到元素間的比較,它利用元素的實際值來確定它們在輸出數組中的位置。通過以下幾步就可以實現:

<1>:先遍歷數組,找出最大值和最小值;
<2>:利用最大值最小值的差值,開闢一個大小爲max-min+1的臨時數組,並將元素初始化爲0;
<3>:遍歷源數組,把源數組每個元素的值減去min後作爲臨時數組的下標,同時在臨時數組中對對應下標的數值進行自增操作;源數組元素值 - min 作爲 臨時數組的下標。
<4>:遍歷臨時數組,按照上面的公式,源數組的元素值 == 臨時數組的下標 + min;需要注意的是可能源數組中一個數字出現了多次,所有在遍歷時需要使用while循環,直至臨時數組的元素值都減到0.

實現代碼:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>

using namespace std;

void CountSort(int* arr, int sz)
{
    int max = arr[0];
    int min = arr[0];

    //遍歷找到最大最小值
    for (int i = 0; i < sz; i++)
    {
        if (arr[i] > max)
            max = arr[i];
        if (arr[i] < min)
            min = arr[i];
    }

    int len = max - min +1;
    vector<int> tmp(len, 0);

    for (int i = 0; i < sz; i++)
        tmp[arr[i] - min]++;

    //開始排序
    int index = 0;
    for (int i = 0; i < tmp.size(); i++)
    {
        while (tmp[i]--)
            arr[index++] = i + min;
    }
}



int main()
{
    int arr[] = { 1,5,5,7,2,11};
    CountSort(arr,sizeof(arr)/sizeof(arr[0]));

    system("pause");
    return 0;
}

臨時數組對應截圖

這裏寫圖片描述

發佈了55 篇原創文章 · 獲贊 192 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章