• 直接插入排序和希尔排序


    算法过程:

    序列S = {S0, S1, S2, ..., Sn-1}是n个可排序的序列,则

    (1). 令i从1递增到n-1,重复步骤(2)-(5).

    (2). 将元素Si保存到临时变量tmp,令j = i-1.

    (3). 确定使条件tmp < Sj成立的最小j值,前提要保证j >= 0.

    (4). 在(3)的过程中依次将子序列{Sj,...,Si-1}后移到{Sj+1,...,Si}.

    (5). 将临时变量tmp放到Sj处。

        public void insertSort(int[] array) {
            for (int i = 1; i < array.length; i++) {
                int tmp = array[i];
                int j = i-1;
                while (j >= 0 && tmp < array[j]) {
                    array[j+1] = array[j];
                    j--;
                }
                array[j+1] = tmp;
            }
        }

    直接插入排序算法复杂度:

    时间复杂度:无序 O(N2),反序O(N2),正序O(N)

    空间复杂度:O(1)

    直接插入排序是稳定的排序方法。

    下面介绍希尔排序,希尔排序是直接插入排序的扩展,即把数据长度由1变成len/2。

    算法过程:

    (1). 先取一个小于n的数据长度间隔dataLen,不防令dataLen=len(array)/2.

    (2). 当dataLen不等于0时,重复步骤(3)-(8).

    (3). 令i从dataLen递增到n-1,重复步骤(4)-(7).

    (4). 将元素Si保存到临时变量tmp,令j = i - dataLen.

    (5). 确定使条件tmp < Sj成立的最小j值,前提要保证j >= 0。注意j 以dataLen递减,而不是1.

    (6). 在(5)的过程中依次将子序列{Sj,...,Si-1}后移到{Sj+dataLen,...,Si-1+dataLen}.

    (7). 将临时便令tmp放到Sj处.

    (8). 重置dataLen=len(array)/2。

        public void shellSort(int[] array) {
            int dataLen = array.length/2;
            while (dataLen != 0) {
                for (int i = dataLen; i < array.length; i++) {
                    int tmp = array[i];
                    int j = i - dataLen;
                    while (j >= 0 && tmp < array[j]) {
                        array[j + dataLen] = array[j];
                        j -= dataLen;
                    }
                    array[j + dataLen] = tmp;
                }
                dataLen = dataLen/2;
            }
        }

    希尔排序算法复杂度分析:

    希尔排序执行时间取决于数据长度间隔dataLen,时间性能优于直接插入排序,是一种不稳定的排序方法。

  • 相关阅读:
    设计模式(十七)Observer模式
    设计模式(十六)Mediator模式
    设计模式(十五)Facade模式
    设计模式(十四)Chain of Responsibility模式
    设计模式(十三)Visitor模式
    设计模式(十一)Composite模式
    设计模式(十二)Decorator模式
    设计模式(十)Strategy模式
    python 函数编程
    python import hashllb
  • 原文地址:https://www.cnblogs.com/lasclocker/p/4862194.html
Copyright © 2020-2023  润新知