vlambda博客
学习文章列表

利用桶排序进行过河处理

接上一篇的过河问题,题目尾出了一个关于桶排序的问题,在这里跟大家讲一讲桶排序,

  • 何为桶排序。

    • 桶排序为利用一个数组下标存储相应数据,进行直接排序。比如 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( ),知识讲解见后期文章讲解,在此先明白合为桶排序,理解好桶排序。