iOS程序员也要学点算法吧-简单排序之插入排序

进入到简单排序的第三个排序,插入排序。其实插入排序,和冒泡,还有选择排序都是比较排序算法的一种,比较效率基本也是O(N²) 但是插入排序,效率基本比冒泡快一倍,选择快一点。
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据的数组,*这里我们可以认为刚开始这个有序数组其实是为空,那么我们排序就是全排序了*
插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

可能不太好理解,我们来看几个图

这只是排序的中间状态,我们可以假定刚开始数组有序的部分为空

Paste_Image.png

Paste_Image.png
2.gif

代码如下

//: MARK - 3 插入排序
func insertionSort<T:Comparable>(aArr:[T]) -> [T] {
    var arr = aArr
    for outerIndex in 1..<arr.count { //  在插入排序中OuterIndex左侧是有序的 , 右侧无需,依次判断 并且向右移动给给被标记变量留出位置
       let temp = arr[outerIndex] // 标记每次需要被插入的数据
       var innerIndex = outerIndex
    
    while innerIndex > 0 && arr[innerIndex - 1 ] >= temp  { // innerIndex , 遍历到最左端也就是0结束,或者是遍历到小于被标记值
            arr[innerIndex] = arr[innerIndex - 1 ]
            innerIndex -= 1 ; // copy 操作
     }
    arr[innerIndex] = temp // 插入被标记值
    
}


return arr

}

   print(insertionSort([9,8,7,6,5,4,3,2,1,0]))

 // 选法的比较效率 O(N²/4) 比冒泡快一倍,比选择快一点

  //对于 基本有序的序列,由于while循环总是为假,算法的效率基本达到O(N²) 对于逆序由于复制太多并没有冒泡快
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 来自微信公众号:开点工作室(ID:kaidiancs) 排序是根据某种标准将一组记录重排的过程,是最常见的计算任务...
    开点工作室阅读 2,132评论 0 8
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,223评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,747评论 0 15
  • 排序的基本概念 在计算机程序开发过程中,经常需要一组数据元素(或记录)按某个关键字进行排序,排序完成的序列可用于快...
    Jack921阅读 1,466评论 1 4
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,309评论 0 35