习题5中为了能够实现在严格的1MB空间内给数据排序,可以使用k趟算法进行排序。每一趟一个区间,k趟我们可以给1000w整数划分k个区间,在这k个区间内分别进行排序,依照这个思路,我写了一个简单的测试用例,如下:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#include <stdio.h>
#include <stdlib.h> #include <string.h> /*memset*/ #define MAxNUM 100 // 最大值 #define COUNT 11 // 排序次数 typedef struct{ unsigned int bit: 1; } bitType; // 占1位 int main( void) { bitType arr[ 1 + MAxNUM/COUNT]; memset(arr, 0, sizeof(arr)); // 清零 int base; if (MAxNUM%COUNT == 0) base = MAxNUM/COUNT; else base = MAxNUM/COUNT + 1; int a[ 10] = { 23, 3, 67, 0, 8, 87, 5, 56, 6, 13}; for ( int i = 1; i <= COUNT; i++) { for( int j= 0; j < 10; j++) { if (a[j] >= base*(i- 1) && a[j] < base*i) { arr[a[j]-base*(i- 1)].bit = 1; } } for( int k= 0; k < (MAxNUM/COUNT + 1); k++) { if (arr[k].bit == 1) printf( "%d\t", k+base*(i- 1)); } memset(arr, 0, sizeof(arr)); // 清零 } return 0; } |