问题描述
看到书上的案例图,觉得是用链表+数组实现,于是一开始参考数据结构老师ppt。但发现实现不了(详见桶排序问题)。
后来想结构直接用二维数组算了。
本来对B[i]数据排序,想用QuickSort,但发现如果是数组B[i][1]至B[i][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 47 48 49 50 51 52 53 54 55 56
| void BUCKET_SORT(Array &A, int n){ bArray B = (Array*)malloc(n * sizeof(Array)); for(int i = 0; i < n; i++){ B[i] = (ElemType*)malloc((n + 1) * sizeof(ElemType)); B[i][0] = 0; for(int j = 1; j < n + 1; j++){ B[i][j] = -1; } } for(i = 0; i < n; i++){ int pos = (int)ceil(n * A[i]) - 1; int j = 1; while(B[pos][j] != -1 && j < n){ j++; } B[pos][j] = A[i]; B[pos][0]++; } for(i = 0; i < n; i++){ if(B[i][0] != 0 && B[i][0] != 1){ for(int j = 1; j < B[i][0] + 1; j++){ for(int k = j; k < B[i][0]; k++){ if(B[i][k] > B[i][k + 1]){ double tmp = B[i][k]; B[i][k] = B[i][k + 1]; B[i][k + 1] = tmp; } } } } } i = 0; int j = 0; int k = 1; while(i < n && j < n){ if(B[j][0] != 0){ if(B[j][k] != -1 && k < n + 1){ A[i] = B[j][k]; B[j][k] = -1; B[j][0]--; k++; i++; } else{ j++; } } else{ j++; k = 1; } } }
|
总结
自己从头写不仅非常耗费时间精力,而且算法效率也不高,体现不出原算法的精妙。或许以后应该直接参考别人的写法?这种完全靠自己实现算法的做法除了让我对调试越来越熟悉以外,其他好像也没什么帮助了吧。(也许还会让自己更有自知之明一些…)