二分插入排序模板

在直接插入排序的基础上,利用二分(折半)查找算法决策出当前元素所要插入的位置。

二分查找:找到中间元素,如果中间元素比当前元素大,则当前元素要插入到中间元素的左侧;否则,中间元素比当前元素小,则当前元素要插入到中间元素的右侧。

找到当前元素的插入位置i之后,把i和high之间的元素从后往前依次后移一个位置,然后再把当前元素放入位置i。

public class SortMethods {

	/*输出数组中的元素*/
	private static void print(int[] a) {
		for(int num: a){
			System.out.print(num+"\t");
		}
		System.out.println();
	}
	private static void swap(int[] a, int i, int j) {
		int temp;
		temp =a[i];
		a[i] = a[j];
		a[j] = temp;
	}

	public static void main(String[] args) {
		int a[] = {0,21,25,49,25,16,15,8,-2,0,-9,67,34,5,12,40};
		binaryInsertSort(a);
		print(a);
	}

	//用二分优化插入排序
	private static void binaryInsertSort(int a[]){
		for(int i=0;i<a.length-1;i++){
			int temp=a[i+1];
			int low=0;
			int high=i;
			int mid;
			//在low与 high之间的区域内进行二分查找,以确定新元素的插入位置
			while(low<=high){
				mid = (high+low)/2;
				if(a[mid]>temp){//若待插入的数小于中间元素a[mid],则目标落于左半区
					high = mid-1;
				}else{//若待插入的数大于等于中间元素a[mid],则目标落于右半区
					low= mid+1;
				}
			}
			//搜索的最后一个小区间的high位置即是查找目标,因此新元素的插入位置即是high+1
			//把原来从high到i范围内的元素依次往后移一个位置
			for(int j=i;j>high;j--){
				a[j+1] = a[j];
			}
			a[high+1] = temp;
		}

	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-30 22:41:20

二分插入排序模板的相关文章

直接插入排序与二分插入排序的C++实现

1.直接插入排序 直接插入排序的过程可以理解为一个固定长度的数组被分为两个集合,即已排序集合和未排序. 开始时已排序集合为空,而未排序集合即为整个数组.当排序开始后插入一个对象,已排序集合元素数目加1,相应地未排序集合元素数目减1,重复插入过程直至将未排序集合清空为止,这时排序集合就是最终结果.如下图: C++实现如下,为了使得程序可以对各种基本数据类型都能排序,使用了模板类,注意模板类的类声明和成员函数实现必须在同一个cpp文件里面,不能分开!! 1 #ifndef INSERTSORT_H

二分插入排序JAVA实现

package kpp.sort; /** * 当前待插入元素data[i],若data[i]>=data[i-1],则表示排序正常,i++处理下一个元素 * 若data[i]<data[i-1],先保存data[i]至temp,二分查找到适合插入的位置k,从k到i-1的元素顺序右移 * 将temp插入到k * * 分析: * 二分插入排序的比较次数与待排序记录的初始状态无关,仅依赖于记录的个数. * 当n较大时,比直接插入排序的最大比较次数少得多.但大于直接插入排序的最小比较次数. * 算法

二分插入排序

二分插入排序算法 一.基本思想:源自于二分查找,假设表中元素是按升序排列,将待插入的关键字与表中间位置记录的关键字与作比较.如果小于该关键字,则将元素插入后面的子表中,反之,如果大于该关键字,则将元素插入前面的子表中.反复迭代,直至所有关键字全部插入表中. 二.C 语言代码: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 //对 R[0...n-1] 递增有序进行直接插入排序 5 void binaryInsertSort(RecTy

常见排序集合(冒泡排序,选择排序,直接插入排序,二分插入排序,快速排序,希尔排序,归并排序)

一下是一些常见的排序算法: 交换元素(后面算法都有用到): // 交换元素 private static void swap(int[] a, int i, int j) { int temp; temp = a[i]; a[i] = a[j]; a[j] = temp; } 冒泡排序(有优化): // 冒泡排序(优化①,②,③,④) private static void bubbleSort(int[] a) { boolean flag = false;// ①表示整个序列是无序的 for

二分查找 模板

1 int bsearch(int l, int h, int k)//二分查找函数 2 { 3 int i, mid; 4 5 while(l<=h){ 6 mid = l+(h-l)/2; 7 if(X[mid]>k) 8 h = mid-1; 9 else if(X[mid]<k) 10 l = mid+1; 11 else 12 break; 13 } 14 return mid; 15 } 1 int max_bsearch(int l, int h, int k)//求上界

快速排序/二分插入排序的swift以及Java实现

经常会用到排序的算法,比如:冒泡法,选择法,快速排序,二分插入排序等等.前面两个就不说了,贴出来自己写的快速排序和二分插入排序的Swift及Java的代码实现,喜欢的话control+C拿去用. swift实现快速排序和二分插入排序算法: (想运行的话,直接复制代码,替换掉控制器里的viewDidLoad方法就好了) override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading

二分算法模板

二分算法求最值,掌握了算法的本质和模板,主要就是答案验证过程,验证过程经常使用贪心算法. 关键是根据题目要求设立命题check(x). 验证答案mid: Check(mid):是否成立? 求满足条件Check(mid)的最小值: –if  check(mid) then r:=mid else l:=mid+1; 求满足条件Check(mid)的最大值: –if  check(mid) then l:=mid else r:=mid-1; 模板一:求满足条件check(mid)的最小值. 1 /

Python使用二分插入排序竟然比直接插入排序快99倍!

?? Python使用二分插入排序竟然比直接插入排序快99倍! 之前发布同一个算法,C++竟然比C快8倍! , 有同学提出是因为C++中使用了二分插入排序,于是用python比较了下两种排序差距有多大. 测试结果如下: Python insertion sort took time: 1:39:42.448904Python insertion sort with binary search took time: 0:01:13.263267 代码如下: import datetime impo

Java使用二分插入排序竟然和直接插入排序速度相差不多

?? Java使用二分插入排序竟然和直接插入排序速度相差不多 之前测试过Python使用二分插入排序竟然比直接插入排序快99倍! 现在测试下 Java,Linux测试结果如下: javac test.java java testInsertSort total milliseconds:15769InsertSortWithBinarySerach total milliseconds:15657 程序如下: import java.util.Date; public class test{ p