首页 > 编程语言 > 详细

桶排序

时间:2018-06-02 13:15:21      阅读:260      评论:0      收藏:0      [点我收藏+]

桶排序:适用于小数排序,相同位数的数进行排序。

我觉得桶排序是计数排序与哈西表的结合

思路:按照最高位申请空间,然后把最高位相同的放入相同的桶中,然后将一个桶中的数排序。(即高位相同的排序)

最后按照顺序,将哈希表中的值放回数组。

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node1
{
    int num;
    struct node1* pnext;
}Node;
Node** CreateHash(int* arr,int len,int n,int* lenth)
{
    if(arr == NULL || len == 0) return NULL;

    int Min = arr[0]/n;
    int Max = arr[0]/n;
    for(int i = 0; i < len;i++)
    {
        if(arr[i]/n < Min)
            Min = arr[i]/n;
        else if(arr[i]/n > Max)
            Max = arr[i]/n;
    }
    *lenth = Max-Min+1;
    Node** HashArr = (Node**) malloc(sizeof(Node*)*(*lenth));
    memset(HashArr,0,sizeof(Node*)*(*lenth));
    for(int i = 0 ;i < len;i++)
    {
        Node* tmp = (Node*)malloc(sizeof(Node*));
        tmp->num = arr[i];
        tmp->pnext = HashArr[arr[i]/n - Min] ;
        HashArr[arr[i]/n - Min] = tmp;
    }

    return HashArr;
}
void Sort(Node** Hash)
{
    Node* tmp = *Hash;
    int n,len = 0;
    while(tmp != NULL)
    {
        len++;
        tmp = tmp->pnext;
    }
    for(int i = 0; i < len;i++)
    {
        tmp = *Hash;
        for(int j = 0; j < len-i-1;j++)//遍历链表,将最大值放在最后
        {
            if(tmp->num > tmp->pnext->num)
            {
                n = tmp->num;
                tmp->num = tmp->pnext->num;
                tmp->pnext->num = n;
            }
            tmp = tmp->pnext;
        }
    }

}
int main()
{
    int arr[] = {100,103,399,419,536,207,108,220};
    int len = sizeof(arr)/sizeof(arr[0]);
    //位数
    int x = arr[0];int n = 10;
    while(x/n)
    {
        n*=10;
    }
    n/=10;
    int lenth;//Hash表长度
    Node** HashArr = CreateHash(arr,len,n,&lenth);
    //排序
    for(int i = 0; i < lenth;i++ )//hash表遍历
    {
        Sort(&HashArr[i]);
    }
    //放回原数组
    int id = 0;
    for(int i = 0; i < lenth;i++)
    {
        while(HashArr[i] != NULL)
        {
            arr[id++] = HashArr[i]->num;
            HashArr[i] = HashArr[i]->pnext;
        }
    }
    //打印数组
    for(int i = 0; i < len;i++)
    {
        printf("%d ",arr[i]);
    }
    //删除
    Node *tmp;
    Node* pDel;
    for(int i = 0; i < lenth;i++)
    {
        tmp = HashArr[i];
        while(tmp)
        {
            pDel = tmp;
            tmp = tmp->pnext;
            free(pDel);
            pDel = NULL;
        }
    }
}

 

桶排序

原文:https://www.cnblogs.com/Lune-Qiu/p/9125153.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!