0
点赞
收藏
分享

微信扫一扫

数据结构:桶排序

王栩的文字 2022-02-24 阅读 85
数据结构

桶排序 

 

 

 

 


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class 桶排序 {
    public static void main(String[] args) {
        //创建由20个随机数组成的数组
        Random r = new Random();
        int[] arr = new int[20];
        int n = 0;
        for (int i = 0; i < 20; i++) {
            arr[n] = r.nextInt(100);
            n++;
        }
        System.out.println(Arrays.toString(arr));
        bucketSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    public static void bucketSort(int[] arr) {
        //确定桶的数量
        int max = arr[0];
        int min = arr[0];
        for (int i : arr) {
            if (i > max) {
                max = i;
            }
            if (i < min) {
                min = i;
            }
        }
        ArrayList<ArrayList<Integer>> bucket = new ArrayList<>();
        int count = (max - min) / arr.length + 1;
        //将桶初始化
        for (int i = 0; i < count; i++) {
            bucket.add(new ArrayList<>());
        }
        //把元素放入对应的桶中
        for (int i : arr) {
            bucket.get((i - min) / arr.length).add(i);
            //这一步是先根据元素的数值算出对应的桶,再把元素加入到桶中
        }
        //把每个桶进行排序,可以采用任意一种排序方法,这里用冒泡排序的方法
        for (int i = 0; i < count; i++) {
            HeapSort3(bucket.get(i));
        }
        //遍历每个桶的每个数据,并存放到数组中
        int x = 0;
        for (ArrayList<Integer> array : bucket) {
            for (Integer i : array) {
                arr[x] = i;
                x++;
            }
        }
    }


    //从后往前比并加判断
    public static void HeapSort3(ArrayList<Integer> arr) {
        //一共要比arr.length-1趟
        for (int n = 0; n < arr.size() - 1; n++) {
            //从后往前比,小的往前放,每趟比完了以后,最小的到了前面
            //每趟从最后开始比,到n
            boolean flag = false;//假设没有发生交换
            for (int x = arr.size() - 2; x >= n; x--) {
                if (arr.get(x) > arr.get(x + 1)) {
                    swap(arr, x, x + 1);
                    flag = true;//发生交换就修改标记
                }
            }
            if (!flag) {
                //如果没有发生交换,可以退出循环
                break;
            }
        }
    }

    public static void swap(ArrayList<Integer> arr, int x, int y) {
        int temp = arr.get(x);
        arr.set(x, arr.get(y));
        arr.set(y, temp);
    }
}

 

举报

相关推荐

0 条评论