iOS-插入排序(Insertion Sort)

插入排序

时间复杂度:O(n²)
稳定性:稳定

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

算法步骤

  1. 将第1个元素作为有序数列,从第2个元素开始遍历,将遍历到的元素插入到有序数列的适当位置;
    从后往前扫描有序数列,如果 待插入元素 较小,则继续往前扫描,直至前面没有比 待插入元素 大的元素为止,即完成一次插入
  2. 重复上面操作,直至待排序元素都插入到适当的位置;
insertionSort.gif

时间复杂度分析

假设序列有n个元素n>1,根据算法步骤,第1轮取第2个元素插入到已排序数列(1个元素)中,第2轮取第3个元素插入到已排序数列(有2个元素)中,… 第(n-1)轮取第n个元素插入到已排序数列(有(n-1)个元素)中。

函数表达式为:
f(n) = 1+2+…+(n-1)
f(n) = n*(n-1)/2
f(n) = (n²-n)/2

用大O表示法,忽略常量、低阶和常数系数。

时间复杂度为:O(n²)

算法代码(Swift)

func insertionSort(numbers: [Int]) -> [Int] {
    
    var sortedNumbers = numbers
    
    for i in 1..

终端打印:

[1, 4, 3, 2, 0, 5, 6, 7, 8, 9] (random numbers)

[1, 4, 3, 2, 0, 5, 6, 7, 8, 9] (1th circle begin, num = 4

[1, 4, 3, 2, 0, 5, 6, 7, 8, 9] (2th circle begin, num = 3
swap at 1 and 2

[1, 3, 4, 2, 0, 5, 6, 7, 8, 9] (3th circle begin, num = 2
swap at 2 and 3
swap at 1 and 2

[1, 2, 3, 4, 0, 5, 6, 7, 8, 9] (4th circle begin, num = 0
swap at 3 and 4
swap at 2 and 3
swap at 1 and 2
swap at 0 and 1

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (5th circle begin, num = 5

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (6th circle begin, num = 6

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (7th circle begin, num = 7

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (8th circle begin, num = 8

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (9th circle begin, num = 9

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] (insertion sort result)

参考资料

RUNOOB.COM-1.3 插入排序

你可能感兴趣的:(iOS-插入排序(Insertion Sort))