【数据结构与算法 00】二分插入排序

算法思想(从小到大排序)

  • N1:遍历数组 array[10000], i 为数组坐标,从1开始
  • N2:以 i 为基数 tmpV=array[i],[0 ,i-1] 为区间坐标,(0+i-1)/2 为 mid 坐标
  • N3:比较 tmpV 与 array[mid],如果大于,则区间为 [mid+1,i-1],否则为[0,mid-1]
  • N4:遍历所有 i 实现以上递归步骤,直到 右坐标<左坐标,因为 while 递归判断时:right>left 区间还有n个数,正常递归,当right=left=mid时,为while递归判断结束,找到结果,区间中只有最后一个数,当 right<left时,跳出while,此时 left或者 right 已被改变(为了跳出递归),但mid没有变

博客地址:http://blog.csdn.net/mkrcpp/article/details/39153951

import java.util.Arrays;

public class Main
{
	// 循环测试次数
	public static int LOOP_COUNT = 100;
	public static int ARRAY_SIZE = 10000;

	public static void main(String[] args)
	{
		int[] mArray = Common.getArray(ARRAY_SIZE);
		int allTime = 0;
		for (int i = 0; i < LOOP_COUNT; i++)
		{
			// 拷贝数组
			int[] tmpArray = Arrays.copyOf(mArray, ARRAY_SIZE);
			long tmpTime = System.currentTimeMillis();
			execute(tmpArray);
			allTime += System.currentTimeMillis() - tmpTime;
		}
		System.err.println(LOOP_COUNT + "次排序的平均耗时:" + allTime / (float) LOOP_COUNT);
	}

	/***
	 * @title 二分插入排序
	 * @description
	 * @author michael.mao
	 * @date 2014年9月5日 下午2:42:29
	 * @version V1.0
	 */
	public static void execute(int[] array)
	{
		for (int i = 1; i < array.length; i++)
		{
			int tmpV = array[i];
			int mid = 0, left = 0, right = i - 1;

			while (right >= left)
			{
				mid = (left + right) / 2;// 中
				if ( tmpV > array[mid] )
					left = mid + 1;
				else
					right = mid - 1;
			}

			// 目标(mid == left ==right)右侧(不包括目标本身)至结尾(i)右移
			for (int j = i - 1; j >= mid + 1; j--)
				array[j + 1] = array[j];
			// 目标赋值
			array[mid] = tmpV;
		}
	}

}
数组大小为(10000)的100次二分插入排序的平均耗时为:10.15 ms
时间: 2024-10-08 23:07:44

【数据结构与算法 00】二分插入排序的相关文章

【数据结构与算法】直接插入排序

直接插入排序的时间复杂度的O(N^2),空间复杂度是O(1). 下面是代码: /** * 源码名称: InsertionSort.java * 日期:2014-08-11 * 程序功能:直接插入排序 * 版权:[email protected] * 作者:A2BGeek */ public class InsertionSort { public void insertionSort(int[] in) { int length = in.length; int i, j; for (i = 1

【数据结构与算法】二分查找

基本思想 首先将给定的值K与表中中间位置元素比较,若相等,则查找成功:若不等,则所需查找的元素只能在中间数据以外的前半部分或者后半部分,缩小范围后继续进行同样的查找,如此反复,直到找到为止. 代码实现 /** * 源码名称:BinarySearch.java * 日期:2014-08-14 * 程序功能:二分查找 * 版权:[email protected] * 作者:A2BGeek */ public class BinarySearch { public static int binaryS

9种排序算法 2_二分插入排序

一 算法思想: 每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止:而查找适当位置的查找方法使用二分查找法,则叫做二分插入排序. 二 代码如下: public class Test2 { // 二分插入排序.随机数列中(100个),计算交换次数(交换的次数在2400-2800左右,时间复杂度O(n*n),效率与直接插入排序一样,只是改变查找方法) public static void binaryInsertSort(int[] array) { i

我的Java开发学习之旅------&gt;Java经典排序算法之二分插入排序

一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较,就是在插入A[i]时,取A[i-1/2]的关键码值与A[i]的关键码值进行比较,如果A[i]的关键码值小于A[i-1/2]的关键码值,则说明A[i]只能插入A[0]到A[i-1/2]之间,故可以在A[0]到A[i-1/2-1]之间继续使用折半比较:否则只能插入A[i-1/2]到A[i-1]之间,故可

Hark的数据结构与算法练习之插入排序

算法说明: 先是拿语言进行一下描述: 假如是做降序排序,那么从头开始扫描每个数字,使每个数字与它前面的若干数字进行比较,直接找到小于当前数字a(当前数字以a代替)的数字b(小于a的数字以b代替). 然后将数字a插入到数学b的位置.将数字b到数字a前一位的数字向后移动一位. 至此,排序结束. 语言表述其实懂这个算法的人能会懂,不懂这个算法的人不太容易看懂,所以还是以例子做一下说明: 例如有一个数组int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3 ,8},一共9个

数据结构与算法之二分查找

问题:如果有一个有100个元素的已经排好序的数组,然后给你一个数,让你判断这个数组里面是否有这个数,你该怎样去做? 最简单的方法就是从数组的第一个元素开始,逐一与所给的数比较,直到比较完所有数组的元素为止,这种查找方法叫简单查找,是一个费事的方法.但我们想,既然这100个数都已经排好序了,那么我先拿中位数与所给数比较,如果两者匹配则问题解决.如果中位数比所给数大,那么所给数可能存在与中位数左边,我们就可以拿左边那些数的中位数与所给数比较:如果中位数比所给数小,那么所给数可能存在与中位数的右边,我

数据结构和算法之——二分查找上

二分查找(Binary Search)的思想非常简单,但看似越简单的东西往往越难掌握好,想要灵活运用就更加困难. 1. 二分查找的思想? 生活中二分查找的思想无处不在.一个最常见的就是猜数游戏,我随机写一个 0 到 99 的数,然后你来猜我写的是什么.猜的过程中,我会告诉你每次是猜大了还是猜小了,直到猜中为止.假如我写的数是 23,猜数过程如下所示. 最多只需要 7 次就猜出来了,这个过程是很快的.同理,要查找某个数据是否在给定的数组中,我们同样也可以利用这个思想. 二分查找针对的是一个有序的数

数据结构与算法之-二分查找

概念     二分查找又称折半查找,它是一种效率较高的查找方法.它的时间复杂度为O(logn)     二分查找要求:有序的线性表 基本思想     二分查找的基本思想是划分当前查找区间,区间的范围一步一步的缩小,如果找到直接返回,反之直到区间只有一个元素时停止 实现     设R为一个值递增的有序线性表     实现步骤: 首先确定该区间的中点位置:mid=[(low+high)/2] 然后将key值与R[mid]的值比较:若相等,则直接返回当前mid,否则进行确定新的区间操作,这分为两种情况

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

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