`

算法回顾之四:折半插入排序

 
阅读更多

算法回顾系列第四篇:折半插入排序

------------------------------------------------

折半插入排序

 

基本原理:

类似直接插入排序,把n个待排序的元素看成为一个有序表和一个无序表,每趟取无序表中的第一个元素插入有序表中。

但在插入的过程中不是与有序表中的每个元素去比较,而是使用二分查找算法确定插入的位置。

 

程序实现:

public static void binaryInsertSort(int[] input){
    	//从数组第二个元素开始排序,因为第一个元素本身肯定是已经排好序的
        for(int i=1;i<input.length;i++){
        	//保存当前值
            int key = input[i];//利用二分查找定位位置
            int index = binarySearch(input,input[i],0,i-1);
            //将目标插入位置,同时右移目标位置右边的元素
            for (int j=i; j>index; j--){
                input[j] = input[j-1];
            }
            input[index] = key;
        }
        //打印数组
        System.out.println(Arrays.toString(input));   
    }
    
    /**
    * 二分查找 
    * @param input 已排序的待查数组.
    * @param target 需要插入的数.
    * @param from 当前数组查找范围的起点(0).
    * @param to 当前数组查找范围的终点(length-1).
    * @return 返回目标在数组中,按顺序应在的位置.       
    */
    private static int binarySearch(int[] input, int target, int from, int to){
    	int range = to-from;//如果范围大于0,即存在两个以上的元素,则继续拆分
    	if(range > 0){
    		//选定中间位
    		int mid = (to+from)/2;
    		//如果临界位不满足,则继续二分查找 
    		if (input[mid] > target){//中间位置的元素值大于目标元素
    			return binarySearch(input,target,from,mid-1);//在0至中间位置查找
    		}else{//中间位置的元素值小于目标元素
    			return binarySearch(input,target,mid+1,to);//在中间位置到末尾位置查找
    		}
    	}else{
          	if (input[from] > target){
          		return from;
          	}else{
          		return from + 1;
          	}
    	}
    }

上面程序中:

找到插入位置后需要将后面的元素每个都后移一个位置。

二分查找算法可以参考我的算法回顾系列文章第三篇。

 

性能分析:

最坏时间复杂度:O(n^2)。

 

空间复杂度:1。

稳定性:稳定的排序。

分享到:
评论

相关推荐

    数据结构排序实验报告

    - 算法原理:先将整个待排序的记录序列分割成若干子序列分别进行直接插入排序,最后再对整个序列进行一次直接插入排序。 - 时间复杂度:取决于增量序列的选择,通常介于O(n)到O(n^2)之间。 - 空间复杂度:O(1)。 ...

    数据结构第九章排序讲稿.doc

    4. **插入排序**:这是最基础的排序算法之一,包括直接插入排序(逐个将元素插入已排序部分)、折半插入排序(利用二分查找减少比较次数)和表插入排序(如希尔排序,通过增量序列改进插入排序的效率)。 5. **快速...

    江苏二级C++常考算法

    本文详细介绍了在江苏二级C++考试中常考的一些重要算法,包括排序算法(如冒泡排序、选择排序、插入排序)、查找算法(如线性查找、二分查找)、递归与迭代以及动态规划等。掌握这些算法不仅对于考试至关重要,对于...

    2018年云南大学842数据结构考研回忆版1

    1. 希尔排序:通过增量序列进行多趟插入排序,每趟排序后元素更接近其最终位置。 十、哈希表 1. 哈希函数设计:将关键字映射到表中的特定位置。 2. 开放定址法:解决哈希冲突的一种策略,当发生冲突时,通过一定的...

    算法复习要点整理

    减治法在算法设计中有着广泛的应用,如插入排序、深度优先与广度优先搜索等,都是通过逐步减少问题规模来达到求解目的。 #### 变治法:转化与解决的智慧 变治法是一种基于变换思想的算法设计策略,其核心在于通过...

    数据结构算法与应用-C++语言描述(2)

    书中包含的50多个应用实例和600多道练习题涵盖了多种实用场景,例如在数组中顺序搜索和折半搜索特定元素,使用不同的排序算法(如计数排序、选择排序、冒泡排序和插入排序)对数组进行排序,以及运用Horner法则计算...

    福建工程学院数据结构与C语言程序设计2021年考研专业课初试大纲.pdf

    - 排序算法(插入排序、快速排序等) #### 三、参考书籍推荐 - 《问题求解与程序设计》鲍春波主编 - 《C 语言程序设计教程》叶东毅主编 - 《数据结构—C 语言版》严蔚敏、李冬梅主编 以上书籍覆盖了大纲中提到的...

    数据结构考试卷子

    - 插入排序的基本思想是从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,并将其放入已排序序列的正确位置上。因此答案是“C. 插入排序”。 ### 进一步的知识点解析 #### 时间复杂度与...

    石油大学数据结构课件3

    - **排序算法**:介绍常见的排序算法(如冒泡排序、选择排序、插入排序、快速排序等)及其时间复杂度分析。 - **查找算法**:讨论不同查找算法的特点及其适用场景,如顺序查找、折半查找等。 - **特殊数据结构**:...

    Linux_C编程一站式学习(高清)

    - **插入排序**: 展示插入排序算法的实现。 - **算法的时间复杂度分析**: 教授分析算法效率的方法。 - **归并排序**: 介绍归并排序算法的工作原理。 - **线性查找**: 解释线性查找算法的应用。 - **折半查找**: 讲解...

    LinuxC编程一站式学习

    - **插入排序**: 详细讲解了插入排序的原理和实现。 - **算法的时间复杂度分析**: 分析了排序算法的效率。 - **归并排序**: 展示了一种分治策略下的高效排序方法。 - **线性查找**: 介绍了顺序查找的基本思想。 - **...

Global site tag (gtag.js) - Google Analytics