桶排序
来源:互联网 发布:家电行业进销存软件 编辑:程序博客网 时间:2024/04/28 13:53
#include <stdio.h>#include <stdlib.h>#include <time.h>#include <MEMORY.H>#define N 15typedef int ElemType;typedef struct tagNode{ ElemType key; struct tagNode *next;}Node, *List;Node *BucketSort(ElemType *pArray, int nArraysize, int BucketSize){ Node *Bucket = (Node *) malloc(sizeof(Node) * BucketSize); memset(Bucket, 0, sizeof(Node) * BucketSize); Node *ptNode, **pBucketEnd = (Node **)malloc(sizeof(Node *) * 10); int index = 0; for (int i = 0; i < nArraysize; i++) { ptNode = (Node *)malloc(sizeof(Node)); ptNode->key = pArray[i]; ptNode->next = NULL; index = pArray[i] / 10; if (!Bucket[index].next) { Bucket[index].next = ptNode; pBucketEnd[index] = ptNode; } else { pBucketEnd[index]->next = ptNode; pBucketEnd[index] = ptNode; } Bucket[index].key++; } free(pBucketEnd); return Bucket;}void InsertSort(Node *Head){ Node *pTemp, *pPrevious; Node *pEnd = NULL; if (Head->key < 2) //如果只有 1 个元素,或没有元素返回 { return; } //这里分成两个链表,剩下的和插入排序思路一样 pPrevious = Head->next; pTemp = Head->next->next; Head->next->next = NULL; //截断链表 for(; pTemp; pTemp = pEnd) { Node *p = Head->next; while(p && pTemp->key > p->key) { pPrevious = p; //记录前一个指针 p = p->next; } if (p == Head->next) { Head->next = pTemp; pEnd = pTemp->next; //被插入节点后面的域的指针 pTemp->next = p; } else { pPrevious->next = pTemp; pEnd = pTemp->next; pTemp->next = p; } }} void main(){ Node *pHead = NULL; Node *Bucket; Node *pTemp ; Node *pVoid; srand(time(NULL)); int nArray[N] = { 0 }; int i = 0; for (i = 0; i < N; i++) { nArray[i] = rand() % 90 + 10; //10--90之间的随机数 printf("%3d", nArray[i]); } printf("\n"); Bucket = BucketSort(nArray, N, 10); //把每个数扔进那类的桶里。 for (i =0; i < 10; i++) { InsertSort(&Bucket[i]); //对每个桶进行排序 } pTemp = (Node *)malloc(sizeof(Node)); pVoid = pTemp; Bucket[0].key = (int) &pTemp; //保存此处地址待一会释放内存 for (i = 0; i < 10; i++) { if (Bucket[i].next) { if (!pHead) //存储头指针 { pHead = Bucket[i].next; } pTemp->next = Bucket[i].next; //将链表链起来 while (pTemp->next) pTemp = pTemp->next; //找尾 } } //输出排序结果 while(pHead) { pTemp = pHead; printf("%3d", pHead->key); pHead = pHead->next; free(pTemp); } free(pVoid); printf("\n"); }