算法过程:
1.找到Max,Min
2.拆高位
3.申请桶
4.元素入桶
5.桶排序
6。放回原数组
7.释放
思想
一句话总结:划分多个范围相同的区间,每个自区间自排序,最后合并。
桶排序是计数排序的扩展版本,计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素,通过映射函数,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序,最后将非空桶中的元素逐个放入原序列中。
桶排序需要尽量保证元素分散均匀,否则当所有数据集中在同一个桶中时,桶排序失效。
个人体会:
桶排序就是相同位数的排序。主要在于两点,元素入桶和排序两个阶段。元素入桶在于确定下标nIndex,利用头插法将元素入桶。桶排序有多种方式可用,冒泡排序,选择排序,插入排序。运用插入排序时,我们可以在元素入桶的时候就排序。下面代码我用冒泡排序来实现。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
int nVal;
struct node *pNext;
}Bucket;
void Sort(Bucket *pHead)
{
Bucket *pTemp = NULL;
Bucket *pMark = pHead;
while (pHead)
{
pTemp = pMark;
while (pTemp->pNext != NULL)
{
if(pTemp->nVal > pTemp->pNext->nVal)
{
pTemp->nVal = pTemp->nVal^pTemp->pNext->nVal;
pTemp->pNext->nVal = pTemp ->nVal^pTemp->pNext->nVal;
pTemp->nVal = pTemp->nVal^pTemp->pNext->nVal;
}
pTemp = pTemp->pNext;
}
pHead = pHead->pNext