• 计数排序(counting-sort)


           计数排序是一种稳定的排序算法,它不是比较排序。计数排序是有条件限制的:排序的数必须是n个0到k的数,所以计数排序不适合给字母排序。计数排序时间复杂度:O(n+k),空间复杂度:O(k),当k=n时,时间复杂度可以达到O(n)。

    计数排序思想:给定一个符合规定的无序数组,先求出这个数组中最大的数,然后开辟一个辅助数组,将无序数组中的数对应到辅助数组中,并计算出每个数出现的次数。再继续从辅助数组中得出到了每个位置,需要排序的数组中的数出现了几次,然后对应的将无序的数组赋值给另一个数组。

    排序过程:

       A:2  5  3  0  2  3  0  3              c:2  0  2  3  0  1

    位置:0  1  2  3  4  5  6  7           位置:0  1  2  3  4  5

       c:2  2  4  7  7  8

    位置:0  1  2  3  4  5

        b:                  3                  c:2  2  4  6  7  8

     位置:0  1  2  3  4  5  6  7            位置:0  1  2  3  4  5

        b:   0              3                    c:1  2  4  6  7  8

     位置:0  1  2  3  4  5  6  7              位置:0  1  2  3  4  5

        b:   0           3  3                    c:1  2  4  5  7  8

     位置:0  1  2  3  4  5  6  7              位置:0  1  2  3  4  5

        b:0  0  2  2  3  3  3  5

     位置:0  1  2  3  4  5  6  7

    示例代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void CountingSort(int arrayA[], int arrayB[], int n)   //进行计数排序
    {
        int max = 0;
        for(int i = 0; i<n; i++)     //找出数组中最大的数
        {
            if(arrayA[i]>max)
                max = arrayA[i];
        }
        int * arrayC = (int *)malloc(sizeof(int)*(max+1));  //开辟一个数组空间,用来存储各个数出现的次数
        memset(arrayC, 0, sizeof(int)*(max+1));      //将开辟的数组进行初始化为0
        for(int i = 0; i<n; i++)     //计算各个数出现的次数
            arrayC[arrayA[i]]++;
        for(int i = 1; i<=max; i++)   //进行次数的累加,以知道到了那个数,出现了几个要排序的数
            arrayC[i] += arrayC[i-1];
        for(int i = n-1; i>=0; i--)    //从高位到低位排序,保证了稳定性
        {
            arrayB[arrayC[arrayA[i]]-1] = arrayA[i];
            arrayC[arrayA[i]]--;
        }
        free(arrayC);  //释放内存
    }
    int main()
    {
        int n;
        int arrayA[100], arrayB[100];
        printf("请输入要排序数组的大小:");
        scanf("%d", &n);
        printf("请输入数组中各个数:" );
        for(int i = 0; i<n; i++)
            scanf("%d", &arrayA[i]);
        CountingSort(arrayA, arrayB, n);
        for(int i = 0; i<n; i++)
            printf("%d  ", arrayB[i]);
    }
  • 相关阅读:
    java小知识点5
    java小知识点4
    java小知识点3
    编程之法:面试和算法心得(寻找最小的k个数)
    389. Find the Difference
    104. Maximum Depth of Binary Tree
    485. Max Consecutive Ones
    693. Binary Number with Alternating Bits
    463. Island Perimeter
    566. Reshape the Matrix
  • 原文地址:https://www.cnblogs.com/fengxmx/p/3823308.html
Copyright © 2020-2023  润新知