• 《算法导论》CLRS算法C++实现(五)P98 计数排序


    第八章 线性时间排序

    8.2 计数排序

    这个算法比较简单。计数排序的基本思想就是对每一个输入元素x,确定出小于x的元素个数。然后就可以把x直接放到它的最终输出数组的位置上。例如如果有17个元素小于x,则x旅游属于第18个输出位置。

    假定输入的日企 数组A[1..n],length[A]=n。另外还需要两个数组:存放排序结果的B[1..n],以及提供临时存储区的C[0..k]。

    COUNTING-SORT(A, B, k)

    1 for i ← 0 to k
    2     do C[i] ← 0
    3 for j ← 1 to length[A]
    4     do C[A[j]] ← C[A[j]] + 1
    5 for i ← 1 to k
    6     do C[i] ← C[i] + C[i - 1]
    7 for j ← length[A] downto 1
    8     do B[C[A[j]]] ← A[j]
    9     C[A[j]] ← C[A[j]] - 1

    C++程序实现

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    void countingSort(int* A, int* B, int lengthA, int k)
    {
        int* C = new int[k + 1];
        memset(C, 0, (k + 1) * sizeof(int));
        for(int j = 0; j < lengthA; j++)
        {
            C[A[j]] = C[A[j]] + 1;
        }
        for(int i = 1; i < (k + 1); i++)
        {
            C[i] = C[i] + C[i - 1];
        }
        for(int j = lengthA - 1; j >= 0; j--)
        {
            B[C[A[j]] - 1] = A[j];
            C[A[j]] = C[A[j]] - 1;
        }
        delete[] C;
    }
    
    int main()
    {
        int arrInitial[] = {2, 5, 3, 0, 2, 3, 0, 3};
        int* arrFinal = new int[8];
        countingSort(arrInitial, arrFinal, 8, 5);
        for(int i = 0; i < 8; i++)
        {
            cout << arrFinal[i] << " ";
        }
        cout << endl;
        return 0;
    }
  • 相关阅读:
    LeetCode() Rotate Image
    LeetCode() Sort Colors
    LeetCode() Spiral Matrix
    LeetCode() Find Minimum in Rotated Sorted Array
    LeetCode(169)Majority Element and Majority Element II
    LeetCode(88) Merge Sorted Array
    LeetCode(283) Move Zeroes
    sql临时表和表变量
    自增长字段自定义
    [转]作者:朱 茂海 CentOS安装iRedMail web邮件服务器
  • 原文地址:https://www.cnblogs.com/juventus/p/2537174.html
Copyright © 2020-2023  润新知