`

排序算法--折半插入排序(二分查找排序)

 
阅读更多

 

折半插入排序其实就是直接插入排序的一种改进,引入了二分查找算法,这样关键字的比较次数就会减少,

数量级为O(nlog^2n),但是元素移动次数还是O(n^2),所以折半插入排序的时间复杂度是O(n^2)。

另外,折半插入排序是稳定的排序算法;

下面是用JAVA写的算法的两种实现方式。不过原理都是一样的

第一种:

  package sort;

import java.util.Arrays;

public class BinarySearch1 {
	public static void main(String args[])
	{
		int array[]={49,38,65,97,76,13,27};
		binarySort(array,array.length);
		System.out.println("---------排序后的结果----------");
		System.out.println(Arrays.toString(array));
	}
	
	//二分查找
	public static int binarySearch(int array[],int low,int high,int temp)
	{
		int mid=0;
		while(low<=high)
		{
			mid=(low+high)/2;
			if(array[mid]<temp&&temp<=array[mid+1])
				return (mid+1);
			else if(array[mid]<temp)
				low = mid + 1;
			else
				high = mid -1;
		}
		return high;
	}
	
	//二分排序
	public static void binarySort(int array[],int size)
	{
		int i,j,k,temp;
		for(i=1;i<size;i++)
		{
			temp=array[i];
			if(array[i]<array[0])
				k=0;
			else
				k = binarySearch(array,0,i,temp);
			
			for(j=i;j>k;j--)
			{
				array[j]=array[j-1];
			}
			array[k]=temp;
			System.out.println(Arrays.toString(array));
		}
	}
}
 

运行结果如下:

  [38, 49, 65, 97, 76, 13, 27]

[38, 49, 65, 97, 76, 13, 27]
[38, 49, 65, 97, 76, 13, 27]
[38, 49, 65, 76, 97, 13, 27]
[13, 38, 49, 65, 76, 97, 27]
[13, 27, 38, 49, 65, 76, 97]
---------排序后的结果----------
[13, 27, 38, 49, 65, 76, 97]
 

第二种:

 

package sort;

import java.util.Arrays;

public class BinarySearch2 {
	public static void main(String args[])
	{
		int array[]={49,38,65,97,76,13,27};
		binaryInsertSort(array,array.length);
		System.out.println("------------排序后的结果-------------");
		System.out.println(Arrays.toString(array));
	}
	
	/**
	 * 
	 * @param array 要排序的数组
	 * @param size 数组的大小
	 */
	public static void binaryInsertSort(int []array,int size)
	{
		int i,j,temp;
		int low,high,mid;
		for(i=1;i<size;i++)
		{
			//将待插入的元素赋给temp,这个元素前面是有序数组,用于插入到有序数组中
			temp=array[i];
			low=0;
			high=i-1;
			while(low<=high)
			{
				//有序数组的中间坐标,此时用于二分查找,减少查找次数
				mid = (low+high)/2;
				//如果有序序列中的中间元素大于待排序的元素,则有序序列的中间坐标向前搜索,否则向后搜索
				if(array[mid]>array[i])
					high=mid-1;
				else
					low = mid + 1;
			}
			/**
			 * j首先赋值为要插入值的前一个元素的最后的坐标,也就是有序数组中最后一个元素的坐标
			 * 然后依次向前扫描有序数组,然后如果满足条件则向后移动数据
			 */
			
			for(j=i-1;j>=low;j--)
			{
				array[j+1]=array[j];
			}
			//将待排序的元素插入到array数组中
			array[low]=temp;
			System.out.println(Arrays.toString(array));
		}
	}
	
}

 运行结果:

 

[38, 49, 65, 97, 76, 13, 27]
[38, 49, 65, 97, 76, 13, 27]
[38, 49, 65, 97, 76, 13, 27]
[38, 49, 65, 76, 97, 13, 27]
[13, 38, 49, 65, 76, 97, 27]
[13, 27, 38, 49, 65, 76, 97]
------------排序后的结果-------------
[13, 27, 38, 49, 65, 76, 97]
 

 

 

分享到:
评论

相关推荐

    C++折半插入排序详解以及代码实现

    在直接插入排序中,我们使用线性搜索来找到新元素应该插入的位置,而在折半插入排序中,我们使用二分搜索来加快查找速度。 以下是折半插入排序的详细步骤: 1. 从第一个元素开始,该元素可以认为已经被排序。 2. ...

    顺序查找表 二分查找表 折半查找表 二叉排序树 C#源代码

    顺序查找表 二分查找表 折半查找表 二叉排序树 C#源代码 注意二叉排序树只实现了查找和插入算法,使用Visual Studio 2008开发

    java实现折半排序算法

    折半插入排序法,又称二分插入排序法,是直接插入排序法的改良版,也需要执行i-1趟插入,不同之处在于,第i趟插入,先找出第i+1个元素应该插入的的位置,假定前i个数据是已经处于有序状态。

    数据结构中的各种排序.doc

    算法时间复杂度O(n2)--[n的平方] 4、折半插入排序 折半插入排序是对插入排序的改进,主要通过二分查找,获得插入的位置 折半插入是一种稳定的排序 排序时间复杂度O(n^2)附加空间O(1) 5、快速排序 快速排序是不稳定的...

    数据结构实验——查找

    一、实验目的 1、掌握查找的不同方法,并能用高级语言实现查找算法。 2、熟练掌握顺序表的查找方法和有序顺序表的折半查找算法以及静态查找树的构造方法和查找算法。...1、有序顺序表的二分查找的递归算法

    C/C++常用算法手册.秦姣华(有详细书签).rar

    4.4 插入排序法 107 4.4.1 插入排序算法 107 4.4.2 插入排序算法示例 108 4.5 Shell排序法 110 4.5.1 Shell排序算法 110 4.5.2 Shell排序算法示例 111 4.6 快速排序法 113 4.6.1 快速排序算法 113 4.6.2 ...

    北语15春《计算机科学导论》作业3.doc

    每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始 位置,直到全部待排序的数据元素排完,这种排序算法被称为()。 A. 冒泡排序 B. 选择排序 C. 插入排序 D. 快速排序 -----------------...

    数据结构第九章 查找作业及答案(100分).docx

    1.在有序表A[1..18]中,采用二分查找算法查找元素值等于A[7]的元素,所比较过的元素的下标依次为 。 2.利用逐点插入法建立序列(61,75,44,99,77,30,36,45)对应的二叉排序树以后,查找元素36要进行 次元素间...

    华南 数据结构上机实验代码 完整代码

    二分查找 哈希查找 直接插入排序 折半插入排序 希尔(shell)排序 冒泡排序 快速排序 简单选择排序 堆排序 归并排序(非递归算法) 基数排序 实现图的存储结构 图的深度遍历 图的广度遍历 二叉排序树的...

    哈工大2012秋数据结构与算法期末考(试卷).pdf

    下列排序算法中,( )算法可能会出现下面情况:在最后一趟(遍)开始之前,所 有元素都不在其最终的位置上。 A. 堆排序 B. 冒泡排序 C. 选择排序 D. 插入排序 5.文件有 m 个初始归并段,采用 k 路归并时,所需要的...

    Python语言进阶知识点总结

    – 对数时间复杂度 – 折半查找(二分查找) – 线性时间复杂度 – 顺序查找 / 桶排序 – 对数线性时间复杂度 – 高级排序算法(归并排序、快速排序) – 平方时间复杂度 – 简单排序算法(选择排序、插入排序、冒泡...

    考研-数据结构-殷人昆.zip

    8.2.2 折半插入排序 237 8.2.3 希尔排序 238 8.3 交换类排序 240 8.3.1 起泡排序 240 8.3.2 快速排序 241 8.4 选择类排序 243 8.4.1 简单选择排序 243 8.4.2 堆排序 244 8.5 二路归并排序 247 8.6 基数排序 248 8.7 ...

    易语言经典算法

    二分排序 抢30 求回文数 斐波那契数列(递推法) 分块查找 求帕斯卡三角(杨辉三角) 箱子问题(贪婪法) 寻找文件(递归法) 求最大公约数(递归法) 取不重复数(排除法) 拉丁方 波松瓦分酒 皇后问题 背包问题 角谷猜想 邮票...

    数据结构实验

    1.二分查找又称为折半查找,它要求要查找的顺序表必须是有序表,即表中结点按关键字有序.并且要用顺序存储结构。 基本思想是:首先将给定值key与表中中间位置记录的关键字相比较,若二者相等,则查找成功,否则...

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    2.4 直接插入排序 2.5 选择排序 2.6 冒泡排序 2.7 希尔排序 2.8 快速排序 第3章 常用的算法思想 3.1 什么是算法 3.2 算法的分类表示及测评 3.2.1 算法的分类 3.2.2 算法的表示 3.2.3 算法性能的测评 3.3 穷举法思想...

    数据结构(C++)有关练习题

    &lt;br&gt; 实验六 二叉树(二) 实验目的: 通过实验掌握下列知识: 1、继续熟悉二叉树的存储结构和遍历算法; 2、熟悉二叉搜索树的应用,并做一个小型的课程设计; 内容及步骤: 1、 在前一个实验...

    高校数据结构期末考题库

    12、快速排序是排序算法中最快的一种。( ) 13、多维数组是向量的推广。( ) 14、一般树和二叉树的结点数目都可以为0。 ( ) 15、直接选择排序是一种不稳定的排序方法。( ) 16、98、对一个堆按层次遍历,不一定...

    易语言5.0自带源代码[经典数学算法集.rar]

    20.二分排序 21.抢30 22.求回文数 23.斐波那契数列(递推法) 24.分块查找 25.求帕斯卡三角(杨辉三角) 26.箱子问题(贪婪法) 27.寻找文件(递归法) 28.求最大公约数(递归法) 29.取不重复数(排除法) 30.拉丁方 31.波松瓦...

    C语言通用范例开发金典.part2.rar

    范例1-78 折半插入排序(顺序结构) 231 ∷相关函数:BInsertSort函数 1.5.3 2—路插入排序(顺序结构) 233 范例1-79 2—路插入排序(顺序结构) 233 ∷相关函数:P2_InsertSort函数 1.5.4 折半插入排序(链式...

Global site tag (gtag.js) - Google Analytics