排序算法----桶排序(数组)

桶排序是一种效率很高的排序算法,它的时间复杂度为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 }

结果:

转载于:https://www.cnblogs.com/xinlovedai/p/6219341.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值