插入排序

直接插入排序

依次将待排序的数据,按其关键值的大小插入到前面的有序序列

实现代码

public class InsertSort
{
    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, "*") };
        System.out.println("排序之前:\n" + Arrays.toString(dataWraps));
        insertSort(dataWraps);
        System.out.println("排序之后:\n" + Arrays.toString(dataWraps));
    }

    public static void insertSort(DataWrap[] dataWraps)
    {
        int arrayLength = dataWraps.length;
        for (int i = 1; i < arrayLength; i++)
        {
            // 保存当前关键元素
            DataWrap tmp = dataWraps[i];
            if (dataWraps[i].compareTo(dataWraps[i - 1]) < 0)
            {
                int j = i - 1;
                for (; j >= 0 && tmp.compareTo(dataWraps[j]) < 0; j--)
                {
                    dataWraps[j + 1] = dataWraps[j];
                }
                dataWraps[j + 1] = tmp;
            }
            System.out.println(Arrays.toString(dataWraps));
        }
    }
}

这种排序效率不高,时间复杂度:O( n2 n 2 )

折半插入排序

是对直接插入排序的优化
对前面的有序序列的中间值进行比较

实现代码

public class BinaryInsertSort
{
    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, "*") };
        System.out.println("排序之前:\n" + Arrays.toString(dataWraps));
        binaryInsertSort(dataWraps);
        System.out.println("排序之后:\n" + Arrays.toString(dataWraps));
    }

    public static void binaryInsertSort(DataWrap[] dataWraps)
    {
        int arrayLength = dataWraps.length;
        for (int i = 1; i < arrayLength; i++)
        {
            DataWrap tmp = dataWraps[i];
            int low = 0;
            int high = i - 1;
            while (low <= high)
            {
                int mid = (high + low) / 2;
                // 大于中间值
                if (tmp.compareTo(dataWraps[mid]) > 0)
                {
                    low = mid + 1;
                } else
                {
                    high = mid - 1;
                }
            }
            for (int j = i; j > low; j--)
            {
                dataWraps[j] = dataWraps[j - 1];
            }
            dataWraps[low] = tmp;
            System.out.println(Arrays.toString(dataWraps));
        }
    }
}

与直接插入排序的效果基本相同,只是更快一些

Shell排序

实现代码

public class ShellSort
{
    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));
        shellSort(dataWraps);
        System.out.println("排序之后:\n" + Arrays.toString(dataWraps));
    }

    public static void shellSort(DataWrap[] dataWraps)
    {
        int arrayLength = dataWraps.length;
        int h = 1;
        while (arrayLength / 3 >= h)
        {
            h = h * 3 + 1;
        }
        while (h > 0)
        {
            System.out.println("===h的值:" + h + "===");
            for (int i = h; i < arrayLength; i++)
            {
                DataWrap tmp = dataWraps[i];
                if (dataWraps[i].compareTo(dataWraps[i - h]) < 0)
                {
                    int j = i - h;
                    for (; j >= 0 && dataWraps[j].compareTo(tmp) > 0; j -= h)
                    {
                        dataWraps[j + h] = dataWraps[j];
                    }
                    dataWraps[j + h] = tmp;
                }
                System.out.println(Arrays.toString(dataWraps));
            }
            h = (h - 1) / 3;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值