看数据结构写代码(65) 基数排序

欢迎指出代码不足

参考书本:严蔚敏《数据结构 .C语言版》

// RadixSort.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#define MAX_SIZE 1000//最大空间
#define RADIX	 10//关键字基数
#define KEY_NUM 3//关键字个数

struct SLNode{//静态链表节点
	int key;
	int next;
};

struct SLList{//静态链表
	SLNode base[MAX_SIZE];
	int keyNum;//关键字数量
	int len;
};

typedef int Arrtype [RADIX];//指针数组

void initList(SLList * list,int * array,int num){
	for (int i = 0; i < num; i++){
		list->base[i].next = i + 1;
		list->base[i+1].key = array[i];
	}
	list->base[num].next = 0;
	list->len = num;
	list->keyNum = 3;
}

int ord(int key,int i){//获取地址 (0~9 )
	if (i == 0){
		return key % 10;
	}
	else if(i == 1){
		return key % 100 / 10;
	}
	else{
		return key / 100;
	}
}

//分配函数
//i : 关键字 次数
//f: 队头指针数组
//e:队尾指针数组
void distribute(SLList * list,int i,Arrtype * f,Arrtype * e){
	for (int j = 0; j < RADIX; j++) (*f)[j] = 0;//清空队头数据
	int next = list->base[0].next;
	for (; next != 0; next = list->base[next].next){
		int index = ord(list->base[next].key,i);
		if ((*f)[index] == 0){
			(*f)[index] = next;
		}
		else{
			list->base[(*e)[index]].next = next;
		}
		(*e)[index] = next;
	}
	printf("\n");

}

int getNext(Arrtype f,int i){
	for ( ; i < RADIX; i++) {
		if (f[i] != 0){
			return i;
		}
	}
	return -1;
}

//收集函数(分配函数 已经 将 需要排序的 数组 分块了,现在 需要 将这些 块 链接起来)
void collect(SLList * list,Arrtype f,Arrtype e){
	int first = getNext(f,0);
	if (first != -1){
		list->base[0].next = f[first];//设置 头指针的后继
		int next = getNext(f,first+1);
		int pre = first;
		for (; next != -1; ){
			list->base[e[pre]].next = f[next];
			pre = next;
			next = getNext(f,next+1);
		}
		list->base[e[pre]].next = 0;//设置最后节点的后继 为 0
	}

}

void printList(SLList list){
	printf("------------------打印静态链表--------------------\n");
	int next = list.base[0].next;
	while (next != 0){
		SLNode nextNode = list.base[next];
		printf("%d\t",nextNode.key);
		next = nextNode.next;
	}
	printf("\n");
}

void radixSort(SLList * list){
	Arrtype f;
	Arrtype e;
	for (int i = 0; i < list->keyNum; i++){
		distribute(list,i,&f,&e);//分配,时间复杂度 O(n),n为 排序数组的大小
		collect(list,f,e);//收集...
		printList(*list);
	}
}



static int testArray[] = {656,301,305,998,999,875,832,423,432,565};

int _tmain(int argc, _TCHAR* argv[])
{
	SLList list;
	initList(&list,testArray,10);
	radixSort(&list);
	return 0;
}
运行截图:

打印了 3次 静态链表,分别 是 对 “个位”,“十位”,“百位” 分配,收集之后 静态链表的情况。

看数据结构写代码(65) 基数排序_第1张图片

你可能感兴趣的:(数据结构)