利用桶排序进行过河处理
接上一篇的过河问题,题目尾出了一个关于桶排序的问题,在这里跟大家讲一讲桶排序,
何为桶排序。
桶排序为利用一个数组下标存储相应数据,进行直接排序。比如 10分制评分情况,评委打分 2 9 1 8 6 此时利用桶排序申请11个数组位置arr[0 ~ 10] 相应分数存储到相应下标。arr[n]存储的是出现了多少次(arr[3] = 4, 则表示3分的情况下出现了4次)。
优点、缺点
优点有:简单,直观,相对稳定,业务场景合适即数据相对密集,离散度不高,桶排序的速度甚至比快速排序还快
缺点有:离散情况下超级耗内存(敲重点),相对业务场景较局限。如果出现超大数时,反而浪费更多时间循环空数据。
复杂度
O(M+C)其中C=N*(logN-logM)
综上所述,上题 过河问题,体重的数据类型为 int ,且体重200KG以内完全够(以船的极限重量作为 桶的最大index也是满足的),所以此场景优选桶排序是一个很好的解法(可能还有更好的 ,说话留一线).
代码如下
public int numRescueBoats(int[] people, int limit) {
if(people.length == 1){
return 1;
}
//计数桶排序
int[] bucket = new int[limit+1];
for (int i = 0; i < people.length; i++) {
bucket[people[i]]++;
}
int L = 0;
int R = bucket.length - 1;
int res = 0;
while(L <= R){
if(bucket[R] == 0 || bucket[L] == 0){
bucket[R] == 0 && R--;
bucket[L] == 0 && L++;
continue;
}
if(R + L <= limit){
if(L == R){
res += Math.ceil(bucket[L] / 2);
break;
}else{
//取出两个最小的数,保证2个配对,调整次数小的指向下一位
int min = Math.min(bucket[R], bucket[L]);
res += min;
bucket[R] -= min;
bucket[L] -= min;
}
}else{
res += bucket[R];
R--;
}
}
return res;
};
关于Array.sort( ),知识讲解见后期文章讲解,在此先明白合为桶排序,理解好桶排序。