桶排序:适用于小数排序,相同位数的数进行排序。
我觉得桶排序是计数排序与哈西表的结合
思路:按照最高位申请空间,然后把最高位相同的放入相同的桶中,然后将一个桶中的数排序。(即高位相同的排序)
最后按照顺序,将哈希表中的值放回数组。
我的代码:
#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