Thuật toán này nó sẽ tạo ra mảng mới, tìm và chèn từng phần tử một vào đúng thứ tự. Sẽ như sau
Cứ coi như phần tử đầu tiên là đúng vị trí
Lấy phần tử đầu tiên này so sánh với phần tử tiếp theo, nó có 2 tình huống một là ở yên vị trí đang ở, hay là chúng ta chèn phần tử thứ 2 vào trước phần tử đầu.
Ý tưởng là sẽ chia đôi thành 2 mảng, rồi trên từng mảng đó, áp dụng một thuật toán sắp xếp trên đó, như insertion sort
functionbucketSort(arr, bucketSize){if(arr.length <2){return arr;}// create buckets and distribute the elementsconst buckets =createBuckets(arr, bucketSize);// sort the buckets using insertion sort and add all bucket elements to sorted result returnsortBuckets(buckets);}functioncreateBuckets(arr, bucketSize){// determine the bucket countlet min = arr[0];let max = arr[0];for(let i =1; i < arr.length; i++){if(arr[i]< min){
min = arr[i];}elseif(arr[i]> max){
max = arr[i];}}const bucketCount =Math.floor((max - min)/ bucketSize)+1;// initialize each bucket (a multidimensional array)const buckets =[];for(let i =0; i < bucketCount; i++){
buckets[i]=[];}// distribute elements into bucketsfor(let i =0; i < arr.length; i++){const bucketIndex =Math.floor((arr[i]- min)/ bucketSize);
buckets[bucketIndex].push(arr[i]);}return buckets;}functionsortBuckets(buckets){const sortedArr =[];for(let i =0; i < buckets.length; i++){if(buckets[i]!=null){insertionSort(buckets[i]);// quick sort is another good option
sortedArr.push(...buckets[i]);}}return sortedArr;}
Lưu ý bucket sort chạy tốt nhất khi có thể chia đều các phần tử cho các bucket, việc chia thành 2 bucket cũng không bắt buộc, có thể chia nhiều hơn nếu số lượng phần tử nhiều