折半插入排序算法的C++实现

折半插入排序思想和直接插入排序类似。

1)找到插入位置;

2)依次后移正确位置及后面的元素。

区别是查找插入位置的方法不同。

折半插入排序使用的折半查找法在一个已经有序的序列中找到查找位置。

注意,折半查找法的一个基本条件就是序列已经有序。

直接上代码:

#include<iostream>
using namespace std;

void binaryInsertionSort(int arr[],int n){

    int mid;
    for(int i=1;i<n;i++){
        int low=0,high=i-1;//将要插入的元素复制出来
        int temp=arr[i];
        //当low>high时,证明折半查找结束
        while(low<=high){
            mid=(low+high)/2;
            //每次和折半查到的元素比较大小
            //当待插入元素比折半查到的元素小时,那么正确插入位置在低半区;否则在高半区
            if(arr[i]<arr[mid])
                high=mid-1;
            else
                low=mid+1;
    }
        //由折半查找到的正确插入位置为high+1
        //将high+1后面的元素依次后移
        for(int j=i-1;j>=high+1;j--)
            arr[j+1]=arr[j];
        //在正确位置插入复制出来的待插入元素
        arr[high+1]=temp;
    }

}

int main(){

    int a[10]={10,9,8,7,6,5,4,3,2,1};
    binaryInsertionSort(a,10);
    for(int i=0;i<10;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;
    return 0;

}

原文地址:https://www.cnblogs.com/dudududu/p/8516088.html

时间: 2024-11-07 17:21:20

折半插入排序算法的C++实现的相关文章

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

直接插入排序(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

[数据结构和算法]折半插入排序算法笔记

/// <summary> /// 步骤: /// 1.记录当前待排元素 /// 2.标记顺序表有序查找区域下界和上界 /// 3.在顺序表有序查找区域中折半查找等待排序元素的位置 /// 4.把顺序表有序查找区域的某些元素后移一位,以空出位置给等待排序的元素 /// 5.在空出的位置填写当前排序元素 /// </summary> /// <param name="elements"></param> static void SqList

排序系列 之 折半插入排序算法 —— Java实现

基本思想: 折半插入算法是对直接插入排序算法的改进,排序原理同直接插入算法: 把n个待排序的元素看成一个有序表和一个无序表,开始时有序表中只有一个元素,无序表中有n-1个元素:排序过程即每次从无序表中取出第一个元素,将它插入到有序表中,使之成为新的有序表,重复n-1次完成整个排序过程. 与直接插入算法的区别在于:在有序表中寻找待排序数据的正确位置时,使用了折半查找/二分查找. 实例: (参考直接插入排序算法:http://www.cnblogs.com/snowcan/p/6244128.htm

数据结构之排序算法Java实现(6)—— 插入类排序之折半插入排序算法

折半插入排序是对直接插入排序进行了改进,在寻找插入点时使用二分查找算法,提高了查询效率. 升序排序: /** * 折半插入排序 * 升序排序 */ @Override public <T extends Comparable<? super T>> void sortByAsc(T[] data) { for(int i = 1;i < data.length;i++ ){ if(data[i].compareTo(data[i - 1]) < 0){ /**记录i的值

【排序】插入排序算法

    特别说明: 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构. 一:插入排序算法思想 01.设待排序序列为 .插入排序将  划分为由已排序好序的  部分 以及 未排序的  部分组成: 注意:刚开始时  部分其实可认为只有一个元素,即: 元素 02.排序开始时,每次从  序列中(随机,但一般是直接取第一个元素)取出一个元素 ,将其插入到已排好序  部分的"适当位置 ",使得以下条件成立:      ,{ 1  x  i  

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

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

排序算法之二分法(折半)插入排序算法

基本思想 折半插入排序的基本思想与直接插入排序一样,在插入第i(i≥1)个元素时,前面i?1个元素已经排好序.差别在于寻找插入位置的方法不同.折半插入排序是採用折半查找法来寻找插入位置的. 折半查找法的基本思路是:用待插元素的值与当前查找序列的中间元素的值进行比較,以当前查找序列的中间元素为分界,确定待插元素是在当前查找序列的左边还是右边,假设是在其左边.则以该左边序列为当前查找序列.右边也相似.依照上述方法,递归地处理新序列.直到当前查找序列的长度小于1时查找过程结束. 代码 //待排数据存储

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

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

排序算法2--插入排序--折半插入排序

折半插入排序 折半插入排序(binary insertion sort)是对插入排序算法的一种改进,所谓排序算法过程,就是不断的依次将元素插入前面已排好序的序列中. 在将一个新元素插入已排好序的数组的过程中,寻找插入点时,将待插入区域的首元素设置为a[low],末元素设置为a[high],则轮比较时将待插入元素与a[m],其中m=(low+high)/2相比较,如果比参考元素小,则选择a[low]到a[m-1]为新的插入区域(即high=m-1),否则选择a[m+1]到a[high]为新的插入区