一、桶排序介绍
桶排序( Bucket Sort )的原理很简单,它是将数组分到有限数量的桶子里。假设待排序的数组 a 中共有 N 个整数,并且已知数组 a 中数据的范围[0, MAX )。在桶排序时,创建容量为 MAX 的桶数组 r ,并将桶数组元素都初始化为0;将容量为 MAX 的桶数组中的每一个单元都看作一个"桶"。
在排序时,逐个遍历数组 a ,将数组 a 的值,作为"桶数组 r "的下标。当 a 中数据被读取时,就将桶的值加1。例如,读到数组 a [3]=5,则将 r [5]的值+1。
二、通排序图文说明
1. 桶排序代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
// 桶排序
//
// 参数说明
// a -- 待排序数组
// n -- 数组a的长度
// max -- 数组a中最大值的范围
void Bucket_Sort(int a[], int n, int max) {
int i, j=0;
int *buckets = (int*)malloc((max+1)*sizeof(int));
// 将buckets中的所有数据都初始化为0
memset(buckets, 0, (max+1) * sizeof(int));
// 1.计数
for (i = 0; i < n; i++) {
buckets[a[i]]++;
printf("%d : %d\n", a[i], buckets[a[i]]);
}
printf("\n");
// 2.排序
for (i = 0; i < max+1; i++) {
while ((buckets[i]--) > 0) {
a[j++] = i;
}
}
}
int main() {
int arr[] = { 9,5,1,6,2,3,0,4,8,7 };
Bucket_Sort(arr, 10,9);
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
BucketSort ( a , n , max )是作用是对数组 a 进行桶排序, n 是数组 a 的长度, max 是数组中最大元素所属的范围[0, max )。
假设 a ={8,2,3,4,3,6,6,3,9}, max =10。此时,将数组 a 的所有数据都放需要为0-9的桶中。如下图:
在将数据放到桶中之后,再通过一定的算法,将桶中的数据提出来并转换成有序数组。就得到我们想要的结果了。
三、桶排序算法的稳定性
归并排序是稳定的算法,它满足稳定算法的定义。
算法稳定性:假设在数列中存在 a[i]= a[j] ,若在排序之前, a [i]在 a[j] 前面并且排序之后, a [i]仍然在 a [ j ]前面。则这个排序算法是稳定的!