桶排序

来源:互联网 发布:家电行业进销存软件 编辑:程序博客网 时间: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"); }