计数排序-《算法导论》学习笔记八

计数排序:假设n个输入元素中的每一个都是在0-k区间内的一个整数(k为正整数),对每一个输入元素x,确定小于x的元素个数,用一个0-k长度的数组做记录,例如输入数组的数为0-10长度,随机出[2,5,3,0,2,3,0,3],可以计算出一个0-10的数组,分别表示小于等于x的数的个数,于是有:0->2,1->2,2->4,3->7,4->7,5->8,6->8,7->8,9->8,10->8,然后再倒序遍历待排序数组,根据值去0-10数组取索引,然后将数组值放入一个新的等长数组那个索引处,取过的索引值要减一,这是为了下次再取到相同值不会放在同一位置,代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>


void counting_sort( 
    int *in_arr, 
    int *out_arr, 
    int arr_len,
    int k )
{
    int *tmp_arr = ( int * )malloc( sizeof(int) * (k + 1) );
    int i = 0, j = 0;

    for ( i = 0; i < k; i++ ) {
        tmp_arr[i]  = 0;
    }

    for ( j = 0; j < arr_len; j++ ) {
        tmp_arr[in_arr[j]] = tmp_arr[in_arr[j]] + 1;

    }

    for ( i = 1; i < k + 1; i++ ) {
        tmp_arr[i] = tmp_arr[i] + tmp_arr[i - 1];
    }

    for ( j = arr_len - 1; j >= 0; j-- ) {
        //printf("j:%d, in_arr[j]:%d, tmp_arr[in_arr[j]]:%d\n",
        //  j, in_arr[j], tmp_arr[in_arr[j]]);
        out_arr[tmp_arr[in_arr[j]] - 1] = in_arr[j];
        tmp_arr[in_arr[j]] = tmp_arr[in_arr[j]] - 1;
    }

    free( tmp_arr );
}

void check_is_inc_arr( 
    int *arr, 
    int len )
{
    int i = 0;

    for ( i = 0; i < len; i++ ) {
        if ( arr[i] < arr[i - 1] ) {
            printf("check_is_inc_arr fail.\n");
            return;
        }   
    }
}
//初始化随机数组
void initArr( int *arr, int lowV,
    int upV, int len )
{
    int i = 0;
    int size = upV - lowV;

    for ( i = 0; i < len; i++ )
    {
        arr[i] = rand() % size + lowV;
    }
}
void print_arr( 
    int *arr, 
    int len )
{
    int i = 0;

    printf("\n=============================================\n");
    for ( i = 0; i < len; i++ ) {
        printf("%d ", arr[i]);
    }
    printf("\n=============================================\n");
}
int main(
    int argc,
    char **argv )
{
    if ( argc != 4 ) {
        printf("input array length and the random value range.\n");
        exit( 0 );
    }

    srand( (int)time(NULL) );

    int length = atoi( argv[1] );
    int lowV = atoi( argv[2] );
    int upV = atoi( argv[3] );

    int *arr = ( int * )malloc( sizeof(int) * (length) );
    int *new_arr = ( int * )malloc( sizeof(int) * length );


    int i = 1000;

    for ( ; i > 0; i-- ) {
        initArr( arr, lowV, upV, length );
        //print_arr( arr, length );
        counting_sort( arr, new_arr, length, upV );
        //print_arr( new_arr, length );
        check_is_inc_arr( new_arr, length );
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值