2.1-插入排序-直接插入

参考链接

  • 插入排序:直接插入排序(Straight Insertion Sort)
  • 白话经典算法系列之二 直接插入排序的三种实现

基本思想

每次将一个待排序的元素,插入到前面已经排好序的子序列中,直到全部元素插入完成为止。

插入排序又分为直接插入排序、二分插入排序、链表插入等,这里只讨论直接插入排序。它是稳定的排序算法,时间复杂度为O(n^2)

待排序记录 R1,R2,… ,Rn–1, Rn
第一步:R1
第二步:(R1 ), R2
第三步:(R1 , R2), R3
……
第 j 步:(R1,R2,… ,Rj–1), Rj
……
第 n 步: (R1,R2,… ,Rn–1), Rn.

算法的实现

/**
     将 array[j] 插入到前面a[0…j-1]的有序区间所用的方法进行改写,用数据交换代替数据后移。
     如果 array[j] 前一个数据 array[j-1] > array[j],就交换 array[j] 和 array[j-1],再 j--
     直到 array[j-1] <= array[j]。这样也可以实现将一个新数据并入到有序区间。
     */
    mutating func insertSort() {
        /*
         1. 整个排序过程共进行n-1趟
         2. 每次取一个元素插入到前面排好序的数组中
         */
        if count < 2 {
            return
        }
        //每次取一个元素插入
        for insert in 1 ..< count {
            var current = insert
            while current > 0{
                let prev = current - 1
                //如果插入元素小于前一个元素 就交换2者,直到找到合适插入位置
                if self[current] < self[prev] {
                    swap(&self[current], &self[prev])
                    current -= 1
                } else {
                    break
                }
            }
            
            print(self)
        }
    }

你可能感兴趣的:(2.1-插入排序-直接插入)