插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)

时间:2022-12-16 20:01:55

插入排序算法主要分为:直接插入算法,折半排序算法(二分插入算法),希尔排序算法,后两种是直接插入算法的改良。因此直接插入算法是基础,这里先进行直接插入算法的分析与编码。

直接插入算法的排序思想:假设有序数组从小到大为array[0],array[1],array[2],....,array[n-2],array[n-1],那么将待排数值array[n]与前面的有序数组从后向前依次比较,直到在有序数组中找到小于待排数值array[n]的位置,将array[n]插入到此位置,并入组合成新的有序数组。

直接插入算法--代码如下所示:

插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
//直接插入排序算法(传递待排数组名,即:数组的地址。故形参数组的各种操作反应到实参数组上)
privatestaticvoid InsertSortionFunction(int[] array)
{
try
{
int temp =; //临时变量,存储待排的数值
for (int i =; i < array.Length; i++) //将无序的所有数值依次插入到有序数组中,注:下标从1开始,因为操作的是同一个数组
{
temp = array[i]; //记录待插入前面有序数组的数值
int index = i -; //记录前方有序数组的末尾位置
while (index >=&& array[index] > temp) //循环遍历前面的有序数组,并且从大到小依次与待排数值进行比较
{
array[index +] = array[index]; //如果index>=0并且此时的值大于待排数值,将此处的值向后移动一位
index--; //index--向前遍历有序数组
}
array[index +] = temp; //由于前面的index--,所以temp插入的位置是index+1
}
}
catch (Exception ex)
{ }
}
插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)

折半排序算法是对直接插入算法的一种优化,优化的核心是:通过折半查看有序数组中间位置的数值(a)与待插入的数值(temp)的大小,如果a>=temp,则转向折半的左区间继续折半查找; 如果a<temp,则转向折半后的右区间继续折半查找。直到左右下标相同时,此时折半的下标也指向相同的位置,再做最后一次循环,最终的结果是:左右下标相差1,并且原来左侧的下标指向大于temp的位置,原来右侧的下标指向了小于temp的位置,即:array[biggerIndex] < temp < array[smallerIndex]。

折半排序算法--代码如下:

插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
   //折半排序算法(传递待排数组名,即:数组的地址。故形参数组的各种操作反应到实参数组上)
        privatestaticvoid BinaryInsertionSortFunction(int[] array)
{
try
{
int smallerIndex =; //记录有序数组的起始位置
int biggerIndex =; //记录有序数组的终止位置
int midIndex =; //记录获取有序数组的中间位置(折半法的关键:折半的位置)
int temp; //记录带排的数值
for (int i =; i < array.Length; i++) //循环向有序数组中插入数值(i从1开始,因为操作的是同一个数组)
{
temp = array[i]; //记录待插入有序数组的数值
biggerIndex = i -;
//当smallerIndex==biggerIndex时,进入最后一次循环:smallerIndex指向大于temp的数组位置,biggerIndex指向小于temp的数组位置
while (smallerIndex <= biggerIndex)
{
midIndex = (smallerIndex + biggerIndex) /; //确定折半的位置
if(array[midIndex] >= temp) //折半位置的数值 >= temp
{
biggerIndex = midIndex -; //biggerIndex以midIndex为基础向前移动一位
}
else
{
smallerIndex = midIndex +; //smallerIndex以midIndex为基础向后移动一位
}
}
for (int j = i -; j >biggerIndex; j--) //将有序数组中大于temp的数值分别向后移动一位
{
array[j +] = array[j]; //
}
array[biggerIndex +] = temp; //将temp插入biggerIndex + 1,因为此时array[biggerIndex]<temp<array[smallerIndex]
}
}
catch (Exception ex)
{ }
}
插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)

  

希尔排序同样是直接插入排序算法的一种改进,基本思想是:将无序的数列划分为若干小的子序列,然后对子序列进行直接插入排序。
时间性能优于直接插入排序算法,但是一种不稳定的排序,时间复杂度为O(nlogn)。
希尔排序算法主要分为3重循环:
第一重循环-->按照gap的大小进行分组,初始化从array.Length/2开始,依次递减到1
第二重循环-->对所有分组进行排序
第三重循环-->组内进行直接插入排序

希尔排序算法--代码如下:

插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)
privatestaticvoid ShellSortFunction(int[] array)
{
try
{
int length = array.Length;
int temp =;
for (int gap = length /; gap >; gap--) //第一重循环,按照gap的大小进行分组
{
for (int i =; i < gap; i++) //第二重循环,对所有分组进行排序
{
for (int j = i; j < length; j = j + gap) //第三重循环,组内进行直接插入排序
{
temp = array[j];
int index = j - gap;
while (index >=&& array[index] > temp)
{
array[index + gap] = array[index];
index = index - gap;
}
array[index + gap] = temp;
}
}
}
}
catch (Exception ex)
{ }
}
插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)

插入排序算法--直接插入算法,折半排序算法,希尔排序算法(C#实现)的更多相关文章

  1. 《Algorithm算法》笔记:元素排序&lpar;2&rpar;——希尔排序

    <Algorithm算法>笔记:元素排序(2)——希尔排序 Algorithm算法笔记元素排序2希尔排序 希尔排序思想 为什么是插入排序 h的确定方法 希尔排序的特点 代码 有关排序的介绍 ...

  2. 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C&plus;&plus;实现

    首先是算法实现文件Sort.h.代码例如以下: <pre name="code" class="java">/* * 实现了八个经常使用的排序算法: ...

  3. C语言中的排序算法--冒泡排序,选择排序,希尔排序

    冒泡排序(Bubble Sort,*译为:泡沫排序或气泡排序)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没 ...

  4. 插入排序与shell排序(希尔排序)

    1 .插入排序的过程如同我们平时打扑克牌取牌插入的过程,不断将取出的扑克牌插入已经排好的地方. 插入排序过程初始有序区间大小为1,取出无序区间的首元素,查找有序区间的合适位置,进行插入.不断重复上述过 ...

  5. 排序之希尔排序&lpar;shell sort&rpar;

    前言 本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此:一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自 ...

  6. 处理海量数据的高级排序之——希尔排序(C&plus;&plus;)

    希尔算法简介                                                                                              ...

  7. Java基础知识强化57:经典排序之希尔排序(ShellSort)

    1. 希尔排序的原理: 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于1959年提出 ...

  8. 排序之希尔排序(JS)

    希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该 ...

  9. 希尔排序及希尔排序java代码

    原文链接:http://www.orlion.ga/193/ 由上图可看到希尔排序先约定一个间隔(图中是4),然后对0.4.8这个三个位置的数据进行插入排序,然后向右移一位对位置1.5.9进行插入排序 ...

  10. 【排序】希尔排序,C&plus;&plus;实现

    原创博文,转载请注明出处! 本文代码的github地址 # 基本思路       希尔排序是”直接插入排序“的改进版,也称为“缩小增量排序”.基本原理:先将待排序的数组元素分成多个序列,然后对每个子序 ...

随机推荐

  1. CSS 实现样式下拉菜单

    下拉菜单的实现 脚本: <script type="text/javascript"> function ShowSub(li) { ]; ; subMenu.styl ...

  2. ajax 如何提交数据到后台jsp页面,以及提交完跳转到jsp页面

    我logincheck.jsp页面取传参数代码: String user=request.getParameter("user1"); String pwd=request.get ...

  3. linux下的依赖关系

    1.一般来说依赖关系可以使得软件较小并且某个lib修复bug以后所有被依赖的软件都能得到好处. 依赖关系下,对于维护也有利有弊,第一,若某个被依赖的软件出现bug或者漏洞,这时候就只需要维护一个软件, ...

  4. oracle中replace、length、lengthb、substr、substrb函数

    1.replacereplace(x,y,z)返回值为将字符串X中的Y串用Z串替换后的结果字符串. replace(x,y)返回值将字符串X中为Y串的地方删除例:epacel('aaabbb','bb ...

  5. Stream 流操作

     Stream 类 先看下面的图 Stream 是所有流的抽象基类(不能被实例化,需要使用他的派生类FileStream/MemoryStream/BufferedStream).流是字节序列的抽象概 ...

  6. mybatis0208 缓存

    查询缓存 1.1缓存的意义 数据在磁盘会有一个IO,高并发读取效率就很低,将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效 ...

  7. Kali Linux 安全渗透教程&amp&semi;lt&semi;第三更&amp&semi;gt&semi;1&period;2 安全渗透所需工具

    了解了渗透測试的概念后.接下来就要学习进行渗透測试所使用的各种工具.在做渗透測试之前.须要先了解渗透所需的工具.渗透測试所需的工具如表1-1所看到的: 表1-1  渗透所需工具 splint unhi ...

  8. strace -o &sol;tmp&sol;dhc&dollar;&dollar; dhclient -d eth2

    http://askubuntu.com/questions/5187/why-is-dhclient-saying-siocsifaddr-permission-denied ip link add ...

  9. 获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄

    有时候在c++调用wpf控件的时候,wpf控件想自己显示窗体,但需要设置owner属性.迂回解决办法是设置wpf的window窗体的父窗体为进程的句柄. 1.获取当前进程id int id = Pro ...

  10. &lbrack;总结&rsqb; 第二类Stirling数

    上一道例题 我们来介绍第二类Stirling数 定义 第二类Stirling数实际上是集合的一个拆分,表示将n个不同的元素拆分成m个集合的方案数,记为 或者 .和第一类Stirling数不同的是,集合 ...