插入排序

插入排序_第1张图片
insertion_sort

插入排序_第2张图片
insertion_sort_example
  • 分类:排序算法
  • 数据结构:数组
  • 最坏时间复杂度:O(n^2)
  • 最优时间复杂度:O(n)
  • 平均时间复杂度:O(n^2)
  • 空间复杂度:总共O(n),需要辅助空间O(1)

插入排序(英文:Insertion Sort),是一种简单直观的排序算法。
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序 在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5

如果 比较操作 的代价比 交换操作 大的话,可以采用 二分查找法(该算法可以认为是 插入排序 的一个变种,称为 二分查找插入排序)来减少 比较操作 的数目

维基百科
Swift

static func insertionSort(array: inout Array) {
    for i in 0.. 0 && tmp < array[j-1] {
            print("while - old - i --- \(i) --- j --- \(j) ---> \(array)")
            array[j] = array[j-1]
            j -= 1
            print("while - new - i --- \(i) --- j --- \(j) ---> \(array)")
        }
        array[j] = tmp
        print(" i final --- \(i) ---> \(array)")
    }
}

排序过程:

原 ---> [10, 120, 13, 5, 80, 40, 90]
 i final --- 0 ---> [10, 120, 13, 5, 80, 40, 90]
 i final --- 1 ---> [10, 120, 13, 5, 80, 40, 90]
while - old - i --- 2 --- j --- 2 ---> [10, 120, 13, 5, 80, 40, 90]
while - new - i --- 2 --- j --- 1 ---> [10, 120, 120, 5, 80, 40, 90]
 i final --- 2 ---> [10, 13, 120, 5, 80, 40, 90]
while - old - i --- 3 --- j --- 3 ---> [10, 13, 120, 5, 80, 40, 90]
while - new - i --- 3 --- j --- 2 ---> [10, 13, 120, 120, 80, 40, 90]
while - old - i --- 3 --- j --- 2 ---> [10, 13, 120, 120, 80, 40, 90]
while - new - i --- 3 --- j --- 1 ---> [10, 13, 13, 120, 80, 40, 90]
while - old - i --- 3 --- j --- 1 ---> [10, 13, 13, 120, 80, 40, 90]
while - new - i --- 3 --- j --- 0 ---> [10, 10, 13, 120, 80, 40, 90]
 i final --- 3 ---> [5, 10, 13, 120, 80, 40, 90]
while - old - i --- 4 --- j --- 4 ---> [5, 10, 13, 120, 80, 40, 90]
while - new - i --- 4 --- j --- 3 ---> [5, 10, 13, 120, 120, 40, 90]
 i final --- 4 ---> [5, 10, 13, 80, 120, 40, 90]
while - old - i --- 5 --- j --- 5 ---> [5, 10, 13, 80, 120, 40, 90]
while - new - i --- 5 --- j --- 4 ---> [5, 10, 13, 80, 120, 120, 90]
while - old - i --- 5 --- j --- 4 ---> [5, 10, 13, 80, 120, 120, 90]
while - new - i --- 5 --- j --- 3 ---> [5, 10, 13, 80, 80, 120, 90]
 i final --- 5 ---> [5, 10, 13, 40, 80, 120, 90]
while - old - i --- 6 --- j --- 6 ---> [5, 10, 13, 40, 80, 120, 90]
while - new - i --- 6 --- j --- 5 ---> [5, 10, 13, 40, 80, 120, 120]
 i final --- 6 ---> [5, 10, 13, 40, 80, 90, 120]
[5, 10, 13, 40, 80, 90, 120]

不定期更新 不合适的地方 还请指点~ 感激不尽

你可能感兴趣的:(插入排序)