桶排序问题与解决

问题描述

看到书上的案例图,觉得是用链表+数组实现,于是一开始参考数据结构老师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;
}
}
//将A分配到B中
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]++;
}
//对B[i]数据排序
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;
}
}
}
}
}
//将B中数据重新给A
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;
}
}
}

总结

自己从头写不仅非常耗费时间精力,而且算法效率也不高,体现不出原算法的精妙。或许以后应该直接参考别人的写法?这种完全靠自己实现算法的做法除了让我对调试越来越熟悉以外,其他好像也没什么帮助了吧。(也许还会让自己更有自知之明一些…)

作者

Hyeee

发布于

2020-09-30

更新于

2020-09-30

许可协议