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

来源:互联网 发布:建筑工地用工人员软件 编辑:程序博客网 时间:2024/05/20 17:23

计数排序:假设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
原创粉丝点击