博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Algorithm】插入排序
阅读量:6572 次
发布时间:2019-06-24

本文共 2292 字,大约阅读时间需要 7 分钟。

一. 算法描述

  插入排序具体算法描述如下:

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

  举个例子:5 7 6 4 3 8

  第一趟:5 7 6 4 3 8  =》5 7 6 4 3 8

  第二趟:5 7 6 4 3 8  =》5 6 7 4 3 8

  第三趟:5 6 7 4 3 8  =》4 5 6 7 3 8

  第四趟:4 5 6 7 3 8  =》3 4 5 6 7 8

  第五趟:3 4 5 6 7 8  =》3 4 5 6 7 8

三. 算法实现

  算法实现1

/** author:Knife* time:2014.06.13 16:07* Algorithm:插入排序(从前向后查找)*/#include
void main_insertSort(){ int intArr[] = {
8,3,6,4,2,9,5,4,1,7}; int n = sizeof(intArr)/sizeof(intArr[0]); // 计算整型数组的长度 int i,j,k,tmp; for(i = 1; i < n; i++){ for( j = 0; j < i; j++){ if(intArr[i] < intArr[j]){ // 插入位置j tmp = intArr[i]; for(k = i; k>j; k--){ intArr[k] = intArr[k-1]; } intArr[j] = tmp; // 插入 } } } // 打印输出 for(i=0; i

  算法实现2

/** author:Knife* time:2014.06.13 16:07* Algorithm:插入排序(从后向前查找)*/#include
void main_1(){ int intArr[] = {
8,3,6,4,2,9,5,4,1,7}; int n = sizeof(intArr)/sizeof(intArr[0]); // 计算整型数组的长度 int i,j,tmp; //插入排序 for(i = 1; i < n; i++){ tmp = intArr[i]; j = i-1; while(j>=0 && (tmp < intArr[j])){ // 插入位置 intArr[j+1] = intArr[j]; j--; } intArr[j+1] = tmp; // 插入操作 } // 打印输出 for(i=0; i

  算法实现3

#include
/** author:Knife* time:2014.06.13 16:43* Algorithm:插入排序(二分查找)*/void main(){ int intArr[] = {
8,3,6,4,2,9,5,4,1,7}; int n = sizeof(intArr)/sizeof(intArr[0]); // 计算整型数组的长度 int i,j,low,high,mid,temp; for(i = 1; i < n; ++i){ low = 0; high = i-1; while(low <= high){ //使用二分查找,寻找插入的位置 mid = low + ((high-low) >> 1); //这种写法,有效避免溢出 if(intArr[i] > intArr[mid]){ low = mid + 1; }else{ high = mid - 1; } } temp = intArr[i]; for(j = i; j > low; j--){ //移动元素 intArr[j] = intArr[j-1]; } intArr[low] = temp; //在合适位置,插入。这里为什么是 low? 得仔细想想(答案参考文献[2])! } // 打印输出 for(i = 0; i < n; i++){ printf("%d ",intArr[i]); } printf("\n");}

四. 算法分析

  • 平均时间复杂度:O(n^2)
  • 空间复杂度:O(1)  (用于记录需要插入的数据)
  • 稳定性:稳定

参考资料

[1] 

[2] 

转载地址:http://erojo.baihongyu.com/

你可能感兴趣的文章
gulp常用命令
查看>>
TCP(Socket基础编程)
查看>>
RowSet的使用
查看>>
表单提交中的input、button、submit的区别
查看>>
每日一记--cookie
查看>>
约瑟夫环
查看>>
S5:桥接模式 Bridge
查看>>
线程池-Executors
查看>>
WPF and Silverlight 学习笔记(十二):WPF Panel内容模型、Decorator内容模型及其他...
查看>>
Codeforces 414B
查看>>
FLUSH TABLES WITH READ LOCK 和 LOCK TABLES比较
查看>>
MySQL:创建、修改和删除表
查看>>
Java多线程程序设计详细解析
查看>>
IOS 7 Study - UISegmentedControl
查看>>
八、通用类型系统
查看>>
JQuery的ajaxFileUpload的使用
查看>>
Java分享笔记:使用keySet方法获取Map集合中的元素
查看>>
Java面向对象练习题之人员信息
查看>>
关于Integer类中parseInt()和valueOf()方法的区别以及int和String类性的转换.以及String类valueOf()方法...
查看>>
python之sys模块详解
查看>>