基数排序的链表实现!!

最近在看《数据结构与算法分析——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申请的内存,以及每次都需要删除以前申请的结构体内存,然后在重新申请一个,这应该会拖慢程序的速度。一个好的想法是只申请一次,以后每次只改变指针的指向。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值