内部排序(3)——插入排序之折半插入排序

因为插入排序的基本思想是在一个有序序列中插入一个新的记录,则能够利用"折半查找"查询插入位置,由此得到的插入排序算法为"折半插入排序"。算法例如以下:

void BInsertSort ()
 {
  // 对顺序表L作折半插入排序
  for ( i=2; i<length; ++i )
  {
   <span style="white-space:pre">	</span>r[0] = r[i];              // 将r[i]暂存到r[0]
   <span style="white-space:pre">	</span>low = 1; high = i-1;
   <span style="white-space:pre">	</span>while (low<=high)
   <span style="white-space:pre">	</span>{            // 在r[low..high]中折半查找有序插入的位置
    <span style="white-space:pre">	</span>m = (low+high)/2;             // 折半
    <span style="white-space:pre">	</span>if (r[0]< r[m])
<span style="white-space:pre">		</span>    high = m-1;  // 插入点在低半区
    <span style="white-space:pre">	</span>else 
<span style="white-space:pre">		</span>    low = m+1;              // 插入点在高半区
   <span style="white-space:pre">	</span>} // while
   <span style="white-space:pre">	</span>for ( j=i-1; j>=low; --j )
<span style="white-space:pre">	</span>    r[j+1] = r[j]; // 记录后移
     r[high+1] = r[0];            // 插入
   }
 } // BInsertSort

  可是。折半插入排序仅仅能降低排序过程中keyword比較的时间,并不能降低记录移动的时间,因此折半插入排序的时间复杂度仍为O (n2)。

时间: 2024-12-08 18:46:03

内部排序(3)——插入排序之折半插入排序的相关文章

算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)

引言: 插入排序作为最简单易于理解的排序算法,基本实现比较简单.本文详细介绍直接插入排序,并给出实现,简单的介绍折半插入排序,并给出2-路插入排序和表插入排序两种插入排序,但并未给出具体实现. 一.直接插入排序 直接插入排序的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的.记录数增1的有序表. 算法描述: 步骤1.将待排序的一组记录中的第1个记录拿出来作为一组有序的记录(当然此时该组记录仅有1个记录). 步骤2.依次将待排序的一组记录中的记录拿出来插入到前面已排好序的记录中. 步

直接插入排序与折半插入排序——Java实现

1.直接插入排序 1)原理说明:直接插入排序是一种最简单的插入排序方法,它的基本思想是,仅有一个元素的序列总是有序的,因此,对n 个记录的序列,可从第二个元素开始直到第n 个元素,逐个向有序序列中执行插入操作,从而得到n 个元素按关键字有序的序列. 2)代码实现如下: package com.test.sort; public class InsertSort { private static void sort(int[] data) { for (int i = 1; i < data.le

数据结构——排序——直接插入排序和折半插入排序算法

直接插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止. 设数组为a[0…n-1]: 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1].令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间. 3. i++并重复第二步直到i==n-1.排序完成. #include<stdio.h> #include<stdbool.h> vo

排序算法总结之折半插入排序

基本思想 折半插入排序是对直接插入排序的简单改进,对于直接插入排序而言,当第i-1趟需要将第i个元素插入前面的0~i-1个元素序列中时,总是需要从i-1个元素开始,逐个比较每个元素,直到找到它的位置.这显然没有利用前面0~i-1个元素已经有序这个特点,而折半插入排序则改进了这一点. 对于折半插入排序而言,当需要插入第i个元素时,它不会逐个进行比较每个元素,而是: (1)计算0~i-1索引的中间点,也就是用i索引处的元素和(0+i-1)/2索引处的元素进行比较,如果i索引处的元素值大,就直接在(0

插入排序(直接插入排序、折半插入排序)

一.直接插入排序 package algorithm.sort.compare.insert; import java.util.Arrays; public class DirectInsertSort { public static void main(String[] args) { int[] arrayA = new int[] {11, 213, 134, 65, 77, 78, 23, 43}; directInsertSort (arrayA); System.out.print

直接插入排序、折半插入排序、Shell排序、冒泡排序,选择排序

一.直接插入排序 稳定,时间复杂度:最好O(n).最差O(n^2).平均O(n^2).空间复杂度O(1) void InsertSort(int L[], int n) { int i, j,key; for (i = 1; i<n; i++) if(L[i] < L[i-1])//须要将L[i]插入到有序表L[0...i-1] { key = L[i]; for(j = i-1; j >= 0 && key < L[j]; j--)//后移 L[j+1] = L[

插入排序——2折半插入排序实现

折半插入与直接插入的不同在于,搜索要插入的位置的时候,使用的是折半搜索(二分搜索).这种查找方式理论上比顺序查找的效率要高. 其代码实现如下: public IList<int> InsertionSort(int[] ary) { for (int i = 1; i < ary.Length; i++) { int low = 0; int high = i - 1; var key = ary[i]; //不断的折半 while (low <= high)//注意包含等号 {

10-2-折半插入排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第10章  内部排序 - 折半插入排序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceListType.c        相关测试数据下载  链接

内部排序-&gt;插入排序-&gt;其它插入排序-&gt;折半插入排序

文字描述 和直接插入排序比较,只是把"查找"操作利用"折半查找"来实现,由此进行的插入排序叫做折半插入排序. 示意图 略 算法分析 和直接插入排序比,减少了比较次数,但是移动次数没有变,所以折半插入排序算法的时间复杂度仍然是n*n, 辅助空间为1,是稳定的排序方法. 代码实现 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define EQ(a, b) ((a) == (b)) 5 #defi