#include <stdlib.h> #include <stdio.h> #include <math.h> void bucketSort(int *p , int n); int getLoopTimes(int num); int findMaxNum( int *p , int n); void sort(int *p , int n , int loop); int main() { int i; int arr[] = {5, 8, 9, 10, 2, 3, 4, 6, 7, 1}; bucketSort(arr, 10); for(i = 0; i < 10; i++) printf("%4d", arr[i]); getchar(); return 0; } void bucketSort(int *p , int n) { //获取数组中的最大数 int maxNum = findMaxNum( p , n ); //获取最大数的位数,次数也是再分配的次数。 int loopTimes = getLoopTimes(maxNum); int i ; //对每一位进行桶分配 for( i = 1 ; i <= loopTimes ; i++) { sort(p , n , i ); } } //获取数字的位数 int getLoopTimes(int num) { int count = 1 ; int temp = num/10; while( temp != 0 ) { count++; temp = temp / 10; } return count; } //查询数组中的最大数 int findMaxNum( int *p , int n) { int i ; int max = 0; for( i = 0 ; i < n ; i++) { if(*(p+i) > max) { max = *(p+i); } } return max; } //将数字分配到各自的桶中,然后按照桶的顺序输出排序结果 void sort(int *p , int n , int loop) { //建立一组桶 此处的20是预设的 根据实际数情况修改 int buckets[10][20] = {0}; //求桶的index的除数 //如798 个位桶index = ( 798 / 1 ) % 10 = 8 // 十位桶index = ( 798 / 10 ) % 10 = 9 // 百位桶index = ( 798 / 100 ) % 10 = 7 // tempNum 为上式中的1、10、100 int tempNum = (int) pow(10 , loop-1); int i , j ; int k; for( i = 0 ; i < n ; i++ ) { int row_index = (*(p+i) / tempNum) % 10; for(j = 0 ; j < 20 ; j++) { if(buckets[row_index][j] == 0) { buckets[row_index][j] = *(p+i) ; break; } } } k = 0; //将桶中的数,倒回到原有数组中 for(i = 0 ; i < 10 ; i++) { for(j = 0 ; j < 20 ; j++) { if(buckets[i][j] != 0) { *(p + k ) = buckets[i][j] ; buckets[i][j]=0; k++; } } } }
#include <stdlib.h> #include <stdio.h> #define NUM 100 void pigeonholeSort(int* array, int length) { int auxiliary[NUM] = {0}; int i, k,j = 0; for(i = 0; i < length; ++i) { auxiliary[array[i]]++; } for(i = 0; i < NUM; ++i) { for(k = 0; k < auxiliary[i]; ++k) { array[j++] = i; } } } int main() { int i; int arr[] = {5, 8, 9, 10, 2, 3, 4, 6, 7, 1}; pigeonholeSort(arr, 10); for(i = 0; i < 10; i++) printf("%4d", arr[i]); getchar(); return 0; }
备注:参考维基百科和百度百科。