桶式排序

这种排序方式需要满足两个特性:

  • 待排序列所有值处于一个可枚举的范围
  • 这个可枚举的范围不应该太大,否则开销太大

    排序的具体步骤如下:
    (1)对于这个可枚举范围构建一个buckets数组,用于记录“落入”每个桶中元素的个数;
    (2)将(1)中得到的buckets数组重新进行计算,按如下公式重新计算:
    buckets[i] = buckets[i] +buckets[i-1] (其中1<=i

public class MergeSort
{
    public static void main(String[] args)
    {
        DataWrap[] dataWraps =
        { new DataWrap(9, ""), new DataWrap(-16, ""), new DataWrap(21, "*"),
                new DataWrap(23, ""), new DataWrap(-30, "*"),
                new DataWrap(-49, "*"), new DataWrap(21, ""),
                new DataWrap(30, "*"), new DataWrap(13, "*"),
                new DataWrap(15, ""), new DataWrap(28, "*"),
                new DataWrap(-2, "*") };
        System.out.println("排序之前:\n" + Arrays.toString(dataWraps));
        mergeSort(dataWraps);
        System.out.println("排序之后:\n" + Arrays.toString(dataWraps));
    }

    public static void mergeSort(DataWrap[] dataWraps)
    {
        sort(dataWraps, 0, dataWraps.length - 1);
    }

    private static void sort(DataWrap[] dataWraps, int left, int right)
    {
        if (left < right)
        {
            // 中间索引
            int center = (left + right) / 2;
            // 对左边数组进行递归
            sort(dataWraps, left, center);
            // 对右边数组进行递归
            sort(dataWraps, center + 1, right);
            System.out.println("left:" + left + " right:" + right);
            // 归并
            merge(dataWraps, left, center, right);
        }
    }

    private static void merge(DataWrap[] dataWraps, int left, int center,
            int right)
    {
        DataWrap[] arrTmp = new DataWrap[dataWraps.length];
        int mid = center + 1;
        int third = left;
        int tmp = left;
        while (left <= center && mid <= right)
        {
            // 将两个数组中取小放入临时数组
            if (dataWraps[left].compareTo(dataWraps[mid]) < 0)
            {
                arrTmp[third++] = dataWraps[left++];
            } else
            {
                arrTmp[third++] = dataWraps[mid++];
            }
        }
        // 原数组剩余部分放入临时数组
        while (mid <= right)
        {
            arrTmp[third++] = dataWraps[mid++];
        }
        while (left <= center)
        {
            arrTmp[third++] = dataWraps[left++];
        }
        // 临时数组内容拷贝到原数组
        while (tmp <= right)
        {
            dataWraps[tmp] = arrTmp[tmp++]; 
        }
        System.out.println(Arrays.toString(dataWraps));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值