分类目录归档:DataStruct

用链表实现基数排序

#include <stdio.h>
#include <stdlib.h>
typedef struct Node *PtrToNode;
typedef PtrToNode List;
struct Node{
	int value;
    PtrToNode Next;
};
enum Index {Gewei=1,Shiwei=10,Baiwei=100};
typedef enum Index Index;

void Delete(PtrToNode p[]);
void PrintList(PtrToNode p[]);
void CopyNode2Arr(PtrToNode p[],int a[]);
void LoadArr2NodeList(PtrToNode p[],int a[],int length,Index nIndex);
int *Sort(PtrToNode p[],int a[],int length, int iterNum);

void LoadArr2NodeList(PtrToNode p[],int a[],int length,Index nIndex)
{
	int i;
	int bitNum;
	PtrToNode tmpCell,yun;

	for(i=0;i<length;i++){
		bitNum = a[i] /nIndex % 10;
		tmpCell = malloc(sizeof(struct Node));
		tmpCell->value = a[i];
		tmpCell->Next = NULL;
		if(p[bitNum]->Next == NULL)
			p[bitNum]->Next = tmpCell;
		else
		{
			yun = p[bitNum];
			while(yun->Next != NULL)
				yun = yun->Next;
			yun->Next = tmpCell;
		}
	}

}

void CopyNode2Arr(PtrToNode p[],int a[]){
	PtrToNode yun;
	int i=0;
	int j;
	for(j=0;j<10;j++){
		if(p[j]->Next != NULL){
			yun = p[j];
			while(yun->Next != NULL){
				yun = yun->Next;
				a[i] = yun->value;
				i++;
			}
		}
	}
}

void PrintList(PtrToNode p[])
{
	int i;
	PtrToNode yun;
	for (i=0;i<10;i++){
		printf("%d:",i);
		if(p[i]->Next != NULL){
			yun = p[i];
			while(yun->Next != NULL){
				yun = yun->Next;
				printf("%d\t",yun->value);
			}
		}
		printf("\n");
	}
	printf("\n");
}

void Delete(PtrToNode p[])
{
	PtrToNode yun,tmpCell;
	int i;

	for(i=0;i<10;i++){
		yun = p[i]->Next;
		p[i]->Next = NULL;
		while(yun != NULL){
			tmpCell = yun->Next;
			free(yun);
			yun = tmpCell;
		}
	}
}

/*
 * @ length: length of a
 * @ iterNum: wei num of max
 */
int *Sort(PtrToNode p[],int a[],int length, int iterNum)
{
	LoadArr2NodeList(p,a,length,Gewei);
	PrintList(p);
	CopyNode2Arr(p,a);
	Delete(p);
	
	LoadArr2NodeList(p,a,length,Shiwei);
	PrintList(p);
	CopyNode2Arr(p,a);
	Delete(p);

	LoadArr2NodeList(p,a,length,Baiwei);
	PrintList(p);
	CopyNode2Arr(p,a);
	Delete(p);

	return a;
}

int
main(int argc, char *argv[])
{
	PtrToNode p[10];
	int i;
	PtrToNode tmp;
	int *result;
	int a[12] = {2,512,34,315,256,65,108,99,11,234,78,89};
	for(i=0;i<10;i++){
		tmp = malloc(sizeof(PtrToNode));
		tmp->Next = NULL;
		p[i] = tmp;
	}
	result = Sort(p,a,12,3);
	for(i=0;i<12;i++)
		printf("%d\t",*(result+i));
	printf("\n");
}
结果如下:
0:
1:11	
2:2	512	
3:
4:34	234	
5:315	65	
6:256	
7:
8:108	78	
9:99	89	

0:2	108	
1:11	512	315	
2:
3:34	234	
4:
5:256	
6:65	
7:78	
8:89	
9:99	

0:2	11	34	65	78	89	99	
1:108	
2:234	256	
3:315	
4:
5:512	
6:
7:
8:
9:

2	11	34	65	78	89	99	108	234	256	315	512