• 基数排序


    #include<stdlib.h>
    #include <strings.h>
    #include<stdio.h>
    #include<math.h>
    typedef struct bucket_item s_bucket_item;
    struct bucket_item{
        int value;
        s_bucket_item * next;
    };
    typedef struct bucket s_bucket;
    struct bucket{
        s_bucket_item * head;
        s_bucket_item * tail;
    };
    s_bucket_item * all_bucket_item_point;
    s_bucket * bucket_array;
    
    void init_bucket(int array_size,int max_byte_value){
        all_bucket_item_point = (s_bucket_item *)malloc(array_size*sizeof(s_bucket_item));
        bucket_array=(s_bucket *)malloc((max_byte_value + 1)*sizeof(s_bucket));
    }
    void reset_bucket(int array_size,int max_byte_value){
        bzero(all_bucket_item_point,array_size*sizeof(s_bucket_item));
        bzero(bucket_array,(max_byte_value + 1)*sizeof(s_bucket));
    }
    void put_bucket(int * values,int array_size,int byte_position){
        int i = 0;
        for(;i < array_size; i++){
            int byte_value = get_byte_value(*(values + i),byte_position);
            (all_bucket_item_point+i)->value=*(values+i);
            (all_bucket_item_point+i)->next=NULL;
            if((bucket_array + byte_value)->head == NULL){
                //this bucket is empty
                (bucket_array + byte_value)->head = all_bucket_item_point+i;
                (bucket_array + byte_value)->tail= all_bucket_item_point+i;
            }else{
                (bucket_array + byte_value)->tail->next = all_bucket_item_point+i;
                (bucket_array + byte_value)->tail = all_bucket_item_point+i;
            }
        }
    }
    void pushback_bucket_to_original_array(int * values,int max_byte_value){
        int i=0,j=0;
        for(;i<max_byte_value + 1;i++){
            while((bucket_array + i )->head!=NULL){
                *(values + j) = (bucket_array + i )->head->value;
                (bucket_array + i )->head = (bucket_array + i )->head->next;
                j++;
            }
        }
    }
    int get_byte_value(int number,int byte){
        if(byte < 1)
            return 0;
        int i=1;
        for(;i<byte;i++){
            number = floor(number / 10);
        }
        return number % 10;
    }
    void dosort(int * values,int array_size,int byte_count,int max_byte_value){
        init_bucket(array_size,max_byte_value);
        int byte_position=1;
        for(;byte_position<=byte_count;byte_position++){
            put_bucket(values,array_size,byte_position);
            pushback_bucket_to_original_array(values,max_byte_value);
        }
        return ;
    }
    
    void printArray(int * values,int array_size){
        int i = 0;
        for(;i<array_size;i++){
            printf("%d ",*(values + i));
        }
    }
    
    int main(int argc,char ** argv){
        int values[] = {1,0,10,20,3,5,6,4,9,8,12,17,34,11};
        init_bucket(14,9);
        dosort(values,14,2,9);
        printArray(values,14);
        free(all_bucket_item_point);
        free(bucket_array);
        printf("
    ");
    }
  • 相关阅读:
    I2C总线驱动框架详解
    Allegro封装的制作
    轮询与中断 简单分析
    SMI#、SCI#信号在OS、BIOS、EC中的中断方式(Linux)
    var
    集合元素重复问题
    子类重写父类属性和方法
    内存(转)
    DesiredSize,RenderSize&& Width ,ActualWidth
    sql select(A.B)拼接
  • 原文地址:https://www.cnblogs.com/HackHer/p/5965412.html
Copyright © 2020-2023  润新知