最近在看《数据结构与算法分析——C语言描述》 Mark Allen Weiss著, 冯舜玺 译。
本书第三章讲到链表的时候,提到了几个可以用链表实现的例子,其中一个就是基数排序,作者只给出了算法的说明,并没有给出源代码,正好前段时间看《 C 和指针》,就自己试着写了一下,比想象中的要难。
#include "radix_sort.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <memory.h>
int radix_sort( int *arr, int len );
int main()
{
int arr[] = { 64, 8, 216, 512, 27, 729, 0, 1, 343, 125 };
Node *rootp;
Node *current;
rootp = NULL;
insert( &rootp, 64 );
insert( &rootp, 8 );
insert( &rootp, 216 );
insert( &rootp, 512 );
current = rootp;
while( current != NULL ){
printf( "%4d", current->value );
current = current->next;
}
printf( "\n ");
radix_sort( arr, 10 );
return EXIT_SUCCESS;
}
int radix_sort( int *arr, int len )
{
int i, j, k;
int max, rem, prev, mod;
Node *temp;
Node **ptr;
ptr = (Node **)malloc( sizeof( Node * ) * len );
if( ptr == NULL )
return FALSE;
memset( ptr, 0, len * sizeof( Node * ) );
max = 0;
for( i = 0; i < len; i++ )
if( arr[ i ] > max )
max = arr[ i ];
prev = 0;
j = 0;
k = 0;
while( ( max = max / len )!= 0 ){
for( i = 0; i < len; i++ ){
mod = arr[ i ];
while( k <= j ){
rem = mod % len;
mod = mod / len;
prev = rem;
k++;
}
delete( &ptr[ prev ] , arr[ i ] );
insert( &ptr[ rem ], arr[ i ]);
}
j++;
}
for( i = 0; i < len; i++ ){
temp = ptr[ i ];
while( temp != NULL ){
printf( "%5d", temp->value );
temp = temp->next;
}
}
return TRUE;
}
#ifndef RADIX_SORT_H_
#define TRUE 1
#define FALSE 0
typedef struct NODE {
struct NODE *next;
int value;
}Node;
int insert( Node **linkp, int value );
int destroy( Node *rootp );
int delete( Node **linkp, int value );
#endif
这个程序还有很多问题,其中最大的问题就是没有free申请的内存,以及每次都需要删除以前申请的结构体内存,然后在重新申请一个,这应该会拖慢程序的速度。一个好的想法是只申请一次,以后每次只改变指针的指向。