计数排序(C语言)

计数排序:
计数排序是一个非基于比较的排序算法。


时间复杂度:? // O(n)
空间复杂度:? // O(n)
是否稳定:不稳定
适用场合:数据很多,且较集中


这里写图片描述


#include <stdio.h>
#include <windows.h>
#include <malloc.h>
#include <string.h>
#pragma warning (disable:4996)

void CountSort(int *arr, int size)
{
    int i;
    int minValue = arr[0];
    int maxValue = arr[0];
    int range = 0;
    int* tmp = 0;
    int count = 0;
    for (i = 0; i < size; i++)//计算数据的分散空间
    {
        if (arr[i] < minValue){
            minValue = arr[i];
        }
        if (arr[i] > maxValue){
            maxValue = arr[i];
        }
    }
    range = maxValue - minValue + 1;
    tmp = (int*)malloc(sizeof(arr[0])*size);//申请辅助空间
    if (tmp == NULL)
        return;
    memset(tmp, 0, sizeof(int)*range);//初始化

    for (i = 0; i < size; i++)//统计每个元素出现的次数
    {
        tmp[arr[i] - minValue]++;
    }

    for(i=0;i<range;i++)//通过统计tmp[];回收元素
    {
        while (tmp[i]--)
        {
            arr[count++] = i + minValue;
        }
    }
    free(tmp);
}

void printf_arr(int arr[],int size) //打印数组
{
    int i = 0;
    for (; i < size; i++)
    {
        printf("%d ", arr[i]);
    }
}



int main()
{
    //int arr[10] = {2,7,1,4,3,9,6,0,5,8};
    int arr[10] = { 4,4,6,7,3,0,9,3,5,2 };
    int size = sizeof(arr) / sizeof(arr[0]);

    CountSort(arr, size);
    printf_arr(arr, size);

    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/romantic_c/article/details/79898442