桶排序是一种效率很高的排序算法,它的时间复杂度为O(N+M),(N个元素,范围为0--M),但桶排序有一定的限制,必须为非负整数,而且元素不宜过大。

算法思想:

设待排序序列的元素取值范围为0到m,则我们新建一个大小为m+1的临时数组并把初始值都设为0,遍历待排序序列,把待排序序列中元素的值作为临时数组的下标,找出临时数组中对应该下标的元素使之+1;然后遍历临时数组,把临时数组中元素大于0的下标作为值按次序依次填入待排序数组,元素的值作为重复填入该下标的次数,遍历完成则排序结束序列有序。

 1 void BucketSort(int intArray[], int Count_intArray, int max)
 2 {
 3     //待排序序列intArray的元素都是非负整数
 4     //设待排序序列intArray的元素有Count_intArray个
 5     //其取值范围为0到max,则我们新建一个大小为max+1的临时数组并把初始值都设为0
 6     //此处是开辟max+1而不是max,因为比如给909,...0排序,是有1000个数,需要开辟999+1长度的数组
 7     int *TmpArray = (int*)malloc(sizeof(int)*(max+1));//开辟一个新数组,这个数组即为桶;
 8     for (int *p = TmpArray; p < TmpArray + max+1 ; p++) *p = 0;//初始化桶,是桶中的每个元素为0;
 9     for (int *p = intArray; p < intArray + Count_intArray; p++) TmpArray[*p] += 1;///将TmpArray下标中等于intArray[i]的元素+1
10     int InsertIndex = 0;//指向intArray的指标
11     for (int j=0; j < max + 1; j++)
12     {
13         for (int k = 1; k <= TmpArray[j]; k++)//需要插入的元素的个数必须>1
14             intArray[InsertIndex++] = j;
15     }
16     free(TmpArray);
17 }

 

该例程输入待排序整形矩阵intArray,元素个数Count_intArray,以及元素最大值max(该max其实只要大于元素中最大的值就行)。

测试函数

 1 #include<stdio.h>
 2 #include<malloc.h>
 3 int main()
 4 {
 5     void BucketSort(int intArray[], int Count_intArray,int max);
 6     int intArray[10] = { 999,55,10,1,0,1,87,45,55,4 };
 7     int Count_intArray = 10;
 8     int max = 999;
 9     BucketSort(intArray, Count_intArray, max);
10     for (int i = 0; i < 10; i++)
11         printf("%d ", intArray[i]);
12     printf("\n");
13 }

结果:

posted on 2016-12-25 13:10  新爱代  阅读(2593)  评论(0编辑  收藏  举报