鴿巢排序Pigeonhole Sort----(排序演算法八)
阿新 • • 發佈:2019-02-12
1.演算法原理
鴿巢排序是對桶排序演算法的改進,只是桶中裝對應下標放元素出現的次數
待排序陣列:a[14] ={ 6, 6, 2, 2, 2, 4, 1, 1, 1, 5, 5, 5, 5, 9 };
桶中: bucket[10]=0 3 3 0 1 4 2 0 0 1
1出次3次,所以bucket[1]=3
2出次3次,所以bucket[2]=3
4出次1次,所以bucket[4]=1
5出次4次,所以bucket[5]=4
6出次2次,所以bucket[6]=2
9出次1次,所以bucket[9]=1
2.程式碼實現
#include <stdio.h> //printArray打印出陣列 void printArray(int a[],int size){ // printf("陣列為:[%d] ",a[0]); for (int i=0;i<size;i++) { printf(" %x ",a[i]); } printf("\n"); } void main() { int a[14] ={ 6, 6, 2, 2, 2, 4, 1, 1, 1, 5, 5, 5, 5, 9 }; int len=14; //分配空桶 int bucket[10]={0} ; printf("排序前:"); printArray(a,len); //直接以每個待排數字為索引,將自己的值賦值給當前桶 for (int i = 0; i < len; i++) { bucket[a[i]]++; } printf("桶中:"); printArray(bucket,10); //跳過值為0的空桶,順序輸出即可 int temp=0; for (int j = 0; j < 10; j++){ while(bucket[j]-->0) a[temp++]=j; } printf("排序後:"); printArray(a,len); }
3.排序結果
排序前: 6 6 2 2 2 4 1 1 1 5 5 5 5 9
桶中: 0 3 3 0 1 4 2 0 0 1
排序後: 1 1 1 2 2 2 4 5 5 5 5 6 6 9