插入排序

来源:互联网 发布:软件开发的发展趋势 编辑:程序博客网 时间:2024/06/05 19:13

直接插入排序

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

实现代码

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)

折半插入排序

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

实现代码

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;        }    }}
原创粉丝点击