插入排序

插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。

为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。

对于插入排序,将其伪代码过程命名为 INSERTION-SORT,其中的参数是一个数组A[1…n],包含长度为n的要排序的一个序列。

该算法原址排序输入的数:算法在数组A中重排这些数,在任何时候,最多只有其中的常数个数字存储在数组外面。在过程INSERTION-SORT结束时,输入数组A包含排序好的输出序列。

# INSERTION-SORT
for j=2 to A.length    # 从第二个数开始进行遍历key = A[j]    # 检查A[j]是否应该插入到A[1..j-1]序列中i = j-1    # 将j与其前j-1个数进行比较while i>0 and A[i] > key    # 如果A[i..j-1]中存在数大于A[j]对应的key值A[i+1] = A[i]    # 将A[i]的值赋给A[i+1],这时候A[i]==A[i+1]i = i-1    # 比较下一个数A[i+1] = key    # 将不符合上面循环的值变为key所对应的值

从伪代码中可以发现,插入排序的最坏运行时间为θ(n2)\theta(n^2)θ(n2),最好运行时间为θ(n)\theta(n)θ(n),平均运行时间为θ(n2)\theta(n^2)θ(n2),空间复杂度为θ(1)\theta(1)θ(1)。

同时,肯定循环条件可以知道,该算法是稳定的。

python代码实现:

def insertion_sort(collection):for loop_index in range(1, len(collection)):insertion_index = loop_indexwhile (insertion_index > 0and collection[insertion_index - 1] > collection[insertion_index]):collection[insertion_index], collection[insertion_index - 1] = (collection[insertion_index - 1],collection[insertion_index],)insertion_index -= 1return collectionif __name__ == "__main__":"""if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ ==        '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行"""user_input = input("输入以逗号分割的数字:\n").strip()unsorted = [int(item) for item in user_input.split(",")]print(insertion_sort(unsorted))

c++代码实现:

#include <iostream>
#include<vector>
using namespace std;void Insert_Sort(vector<int>& arr,int n)  # &是引用
{for(int loop_index=1;loop_index<n;++loop_index){int insertion_index =  loop_index;while(insertion_index > 0 && arr[insertion_index-1]>arr[insertion_index]){swap(arr[insertion_index-1],arr[insertion_index]);insertion_index--;}}
}int main() {vector<int> arr;int num;int n;while(cin>>num ){arr.push_back(num);n++;}Insert_Sort(arr,n);for (int i = 0; i < arr.size(); i++) {cout << arr[i] << ",";}return 0;
}

数据结构——插入排序相关推荐

  1. 数据结构:插入排序(Insertion sort)

    package com.sortbasic;import java.util.Random;public class InsertionSort {// 数组private static int[] ...

  2. 数据结构--插入排序

    插入排序的一种Go实现 package mainimport "fmt"//插入排序是仅次于快速排序的高效排序算法,插入排序和冒泡排序.选择排序一样都是内部排序(内存) //与其他 ...

  3. python算法与数据结构-插入排序算法

    插入排序分析 开始的默认的第一个元素93为有序系列,其余的元素为无序系列,如下所示: 54和93比,54比93小,所以把54放在前面,如下所示: 代码如下所示: # coding:utf-8 def ...

  4. python算法与数据结构-插入排序算法(34)

    阅读目录 一.插入排序的介绍 二.插入排序的原理 三.插入排序的图解 四.插入排序的python代码实现 五.插入排序的C语言代码实现 六.插入排序的时间复杂度 七.插入排序的稳定性 一.插入排序的介 ...

  5. 数据结构 插入排序(InsertionSort Sort) 详解 附C++代码实现:

    目录 简介: 算法描述: 代码实现: 总结: 简介: 是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 时间复杂度为o(n^2 ...

  6. 数据结构——插入排序算法详解(C语言)

    插入排序的算法思想是:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适合位置上,直到所有待排序记录全部插入为止. 例如,打扑克牌在抓牌时,每抓一张牌,就插入到合适的位置,直到抓 ...

  7. Caché 算法与数据结构

    第一章 Caché 算法与数据结构 基础和概念 ☆☆☆☆☆ 第二章 Caché 算法与数据结构 数组原理 ☆☆☆☆☆ 第三章 Caché 算法与数据结构 链表原理 ☆☆☆☆☆ 第四章 Caché 算法 ...

  8. 计算机课中排序选什么,《计算机应用基础课件》1.6 排序复习课程.ppt

    <计算机应用基础课件>1.6 排序复习课程.ppt 第 1 章 数据结构 ;插入排序的基本思想: ;1.直接插入排序: 思路:认可第1个记录已排好序,然后将第2个到第n个记录依次插入到前面 ...

  9. 排序算法的总结与使用题型

    基于比较的排序 1.冒泡排序: 谁大谁在最前面,每一轮把最大的顶到天花板上 效率太低-O(n^2)-------掌握swap 2.选择排序:效率太低,但经常用它内部的循环方式来找到最大值和最小值--- ...

最新文章

  1. 尚未备份数据库 *** 的日志尾部。如果该日志包含您不希望丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 备份该日志。...
  2. HTML SVG 如何下载svg文件,png文件,jpge文件
  3. openwrt mt7620 内存大小检测
  4. 职业规划:少走弯路的十条忠告
  5. 【转载】ADS分散加载文件使用总结(lpc23xx)
  6. macOS下利用dSYM文件将crash文件中的内存地址转换为可读符号
  7. 空间站是如何绕地飞行的?张朝阳物理课开播啦
  8. KPI总结模板:What
  9. NLP工具包(Albert+BiLSTM+CRF)
  10. P3194 [HNOI2008]水平可见直线
  11. 关于wow(mangos模拟器) 的物品生成器---wowItemEdit 1.0
  12. 双网卡同时上内外网的解决方法
  13. 基于C#制作的简易代码生成器
  14. 科技爱好者周刊:第 75 期
  15. Audio Hijack for Mac(音频录制软件)
  16. 微信自动投票的php代码
  17. 谈互联网产品运营(转载)
  18. 传统家装有落差,VR全景家装让你体验新房落成效果
  19. 33岁,工作10年的老测试员被裁,所谓经验根本不值钱
  20. SCSI总线和协议以及SAN存储网络详解

热门文章

  1. 开源搜索引擎solr4.0+tomcat7实现中文分词
  2. java实现简单的约瑟夫环问题
  3. 总帐明细账对账不平数据库修改
  4. 申请Let's Encrypt永久免费SSL证书
  5. ORACLE Dataguard安装
  6. 创建设计模式 - 抽象工厂设计模式
  7. OSPF高级特性——LSA-3(Network Summary LSA)的过滤、路由协议——管理距离的修改、外部路由的metric值的修改
  8. iOS开发用如何用类quot;SKStoreProductViewControllerquot;跳转AppStore点赞评分?
  9. 【苹果cms10 Maccmsv10 站群深度定制版 开发日志】 新增日志模块
  10. SpringMVC 异步交互 AJAX 文件上传