一、算法原理

折半插入排序是插入排序方法中一种,相比较与直接插入排序算法,减少了排序过程中比较次数,也是一种常用的排序算法。
折半插入排序算法基本原理是将折半查找方法与直接插入排序方法相结合,也就是在每一次插入新元素时,利用折半查找方法找到其待插入的位置。
下面Demo演示了折半插入排序的实现过程。

Demo:
假设有数组:

折半插入排序首先把第一个元素直接放到排好序的数组中,第二个元素可以使用直接插入排序法进行排序,从第三个元素开始进行插入排序。
第一趟排序:

第二趟排序:l =0表示左,h=1表示右,m=(l+h)/2=1表示中间,其位置如下表所示,元素arr[2]=3是待插入元素,首先将其缓存到t。

此时arr[m] < t,因此修改l为m+1=1,之后重新计算m=(l+h)/2=1

再次比较出现arr[m] > t,因此修改h为m-1=0,出现了h<l的情形,因此结束本趟的排序,记录h的位置(h=0),然后把h+1位置的元素向后移动一位,将t的值插入到arr[h+1].

第三趟排序:将元素arr[3]缓存给t,然后重复第二趟排序的方法即可
第四趟排序和第五趟排序,同上述方法一样,经过五趟排序之后,就完成了对该数组的折半插入排序。

二、折半插入排序算之C程序及测试

1. 折半插入排序

//将数组arr按照折半插入排序算法进行排序
void BinInsertSort( int arr[], int n )
{int i, j, lo, mid, hi, t;//第二个元素做直接插入排序 if( arr[1] < arr[0] ){t = arr[0];arr[0] = arr[1];arr[1] = t;}
//从第三个元素开始进行折半插入排序for( i = 2; i < n; i++ ){t = arr[i];lo = 0;hi = i-1;//折半查找插入位置 while( lo <= hi ) {mid = int( (lo + hi) / 2 );if( t < arr[mid] ){hi = mid - 1;}else if( t > arr[mid]  ) {lo = mid + 1;}else{hi = mid;break;}}//从hi+1位置到i-1,向后依次移动元素,空出hi+1位置存储新插入的元素 for( j = i - 1; j >= hi + 1; j-- ){arr[j + 1]= arr[j];}arr[hi + 1] = t;}
}

2.完整的代码(仅供参考)

#include"stdio.h"
void BinInsertSort( int arr[], int n );int main()
{int arr[] = { 4, 1, 3, 5, 4, 2 };int n = 6;printf( " Initial Array  : " );for( int j = 0; j < n; j++  ){printf( "%5d", arr[j] );}printf( "\n" );BinInsertSort( arr, n );return 0;
}
//将数组arr按照折半插入排序算法进行排序
void BinInsertSort( int arr[], int n )
{int i, j, lo, mid, hi, t;//第二个元素做直接插入排序 if( arr[1] < arr[0] ){t = arr[0];arr[0] = arr[1];arr[1] = t;}printf( " No. 1 time sort: " );for( j = 0; j < n; j++  ){printf( "%5d", arr[j] );}printf( "\n" );//从第三个元素开始进行折半插入排序for( i = 2; i < n; i++ ){t = arr[i];lo = 0;hi = i-1;//折半查找插入位置 while( lo <= hi ) {mid = int( (lo + hi) / 2 );if( t < arr[mid] ){hi = mid - 1;}else if( t > arr[mid]  ) {lo = mid + 1;}else{hi = mid;break;}}//从hi+1位置到i-1,向后依次移动元素,空出hi+1位置存储新插入的元素 for( j = i - 1; j >= hi + 1; j-- ){arr[j + 1]= arr[j];}arr[hi + 1] = t;
//向屏幕输出每趟排序结果printf( " No. %d time sort: ", i );for( j = 0; j < n; j++  ){printf( "%5d", arr[j] );}printf( "\n" );}
}

3.测试用例
测试一:

测试二(有相同数据):

折半插入排序算法详解之C语言版相关推荐

  1. 经典排序算法(4)——折半插入排序算法详解

    折半插入排序(Binary Insertion Sort)是一种插入排序算法,通过不断地将数据元素插入到合适的位置进行排序,在寻找插入点时采用了折半查找. 一.算法基本思想 (1)基本思想 折半插入排 ...

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

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

  3. 选择排序算法详解之C语言版

    一.算法原理 选择排序属于不稳定排序法,是一种常用的排序算法,其时间复杂度为O(n^2). 所谓的不稳定排序算法是指在一组数据中存在多个相同的数据,但是在排序之后,相同数据的前后位置会发生改变.例如有 ...

  4. 计算机操作系统——银行家算法详解(C语言版)

    目录 一.实验目的 二.实验内容 三.实验要点说明 数据结构 银行家算法bank()函数 安全性算法safe()函数 银行家算法实例 程序结构 四.实验代码 五.结果展示 一.实验目的 通过编写一个模 ...

  5. 哈希(Hash)查找算法详解之C语言版

    一.哈希查找算法原理 哈希查找是一种快速查找算法,该算法不需要对关键字进行比较,而是以关键字为自变量,以该关键字在存储空间中的地址为因变量,建立某种函数关系,称为哈希函数,这样在查找某一关键字的时候, ...

  6. 霍夫曼(Huffman)编码算法详解之C语言版

    一.Huffman编码 霍夫曼(Huffman)树是一类带权路径长度最短的二叉树树.Huffman树的一个非常重要的应用就是进行Huffman编码以得到0-1码流进行快速传输. 在电报收发等数据通讯中 ...

  7. 插入排序算法详解(从后往前)

    插入排序算法详解(从后往前) A. 把最后一个元素当成一个降序数组-----降序 1.核心代码 for (int i = 0; i <numbers.length-1; i++) {//j的初始 ...

  8. 图之邻接矩阵详解(C语言版)

    文章目录 一.定义 二.结构 三.常用操作 结语 附录 一.定义 图的邻接矩阵是一种采用邻接矩阵数组表示顶点之间相邻关系的存储结构.设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为:       ...

  9. 图遍历详解(C语言版)

    文章目录 一.定义 二.方法 1.深度优先遍历 2.广度优先遍历 三.实现 1.无向图或强连通有向图遍历 2.非连通图遍历 结语 附录 一.定义 从给定图中任意指定的顶点(称为初始点)出发,按照某种搜 ...

最新文章

  1. 这样你的电脑还不玩完!?
  2. 送你一朵小红花观后感
  3. Overlapped I/O模型深入分析[转]
  4. 均匀白噪声的定义及特点_噪声的物理本质是什么?
  5. 收集bug开源框架_划重点 | 小程序框架全面测评
  6. 【做题记录】 [JLOI2011]不等式组
  7. 通过Scanner从控制台获取数据
  8. 分享我的学习方法——还是坚持+努力
  9. SAP License:家装ERP
  10. 理解JavaScript中的多态
  11. 一片关于Bootstarp4的文章
  12. B+/-Tree原理(mysql索引数据结构)
  13. 【Multisim仿真】5V-12V可调直流稳压电源
  14. 用Pandas做透视表
  15. 分享几款UI设计师快速提升工作效率的辅助设计软件
  16. 原神手游怎么用电脑玩 原神模拟器玩法教程
  17. html下拉框的宽度怎么设置,在HTML选择下拉选项中设置下拉元素的宽度
  18. 开源中文切词工具介绍
  19. vscode代码自动格式化快捷键
  20. 枚举 _枚举的其他应用

热门文章

  1. Java判断不为空的工具类总结
  2. 命令模式---烧烤点单
  3. 小米7.0系统机器最简单激活XPOSED框架的教程
  4. webpack手动配置以及自动配置
  5. win10录屏快捷键是什么?录屏快捷键怎么设置
  6. web二级提纲的基本概念
  7. ajax get before,ajax async false beforeSend无效解决方案
  8. BEGIN TRANSACTION
  9. 培训动态 | 第2期PGCA-浪潮K1 Power培训认证圆满结束
  10. 超级计算机 浙江,南方又要下雪!超级计算机:浙江安徽可能性大,上海江苏可能性小...