数据结构之排序算法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的值*/
				T temp = data[i];
				/**记录搜索范围的左边界*/
				int low = 0;
				/**记录搜索范围的右边界*/
				int high = i - 1;
				while(low <= high){
					/**记录中间位置*/
					int mid = (high + low)/2;
					/**比较中间位置数据和i处数据大小,以缩小搜索范围*/
					if(data[mid].compareTo(temp) < 0){
						low = mid + 1;
					}else{
						high = mid - 1;
					}
				}
				/**移动low~i处数据整体向后移动*/
				for(int j = i; j > low; j--){
					data[j] = data[j - 1];
				}
				data[low] = temp;
			}
		}
	}

  降序排序:

	/**
	 * 折半插入排序
	 * 降序排序
	 */
	@Override
	public <T extends Comparable<? super T>> void sortByDesc(T[] data) {
		for(int i = 1;i < data.length;i++ ){

			if(data[i].compareTo(data[i - 1]) > 0){
				/**记录i的值*/
				T temp = data[i];
				/**记录搜索范围的左边界*/
				int low = 0;
				/**记录搜索范围的右边界*/
				int high = i - 1;
				while(low <= high){
					/**记录中间位置*/
					int mid = (high + low)/2;
					/**比较中间位置数据和i处数据大小,以缩小搜索范围*/
					if(data[mid].compareTo(temp) > 0){
						low = mid + 1;
					}else{
						high = mid - 1;
					}
				}
				/**移动low~i处数据整体向后移动*/
				for(int j = i; j > low; j--){
					data[j] = data[j - 1];
				}
				data[low] = temp;
			}
		}

	}

  

时间: 2024-10-05 23:55:51

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

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

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

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

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

插入类排序:直插,折半插,希尔

插入类排序: 1:直接插入排序O(n^2) 2:折半插入排序O(n^2) 3:希尔排序 O(n乘以log以2为底,n的对数) 空间复杂度都是O(1) //直接插入排序 void InsertSort(int R[],int n) { int i,j; int tmp; for(i=1;i<n;i++)//数组下标从0开始,第一个有序,所以从1开始 { tmp=R[i]; j=i-1; while(j>=0 && tmp<R[j])//元素右移,以便插入 { R[j+1]=

详谈排序算法之插入类排序(两种思路实现希尔排序)

1. 排序( sorting) 的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列.其确切的定义为: 假设有n个数据元素的序列{R1 , R2 , - , Rn},其相应关键字的序列是{K1 , K2 , - , Kn} ,通过排序要求找出下标 1 , 2 , - , n的一种排列p1 , p2 , - , pn,使得相应关键字满足如下的非递减(或非递增)关系Kp1 ≤ Kp2 ≤ - ≤ Kpn这样,就得到一个按关键字有序的纪录序列{ Rp1 , Rp2 , - , Rpn }

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

折半插入排序思想和直接插入排序类似. 1)找到插入位置: 2)依次后移正确位置及后面的元素. 区别是查找插入位置的方法不同. 折半插入排序使用的折半查找法在一个已经有序的序列中找到查找位置. 注意,折半查找法的一个基本条件就是序列已经有序. 直接上代码: #include<iostream> using namespace std; void binaryInsertionSort(int arr[],int n){ int mid; for(int i=1;i<n;i++){ int

数据结构与算法——插入类排序(直接插入排序,希尔排序)

一.直接插入排序 对于一个有序的序列,不断将后面的元素插入前面的有序序列,保持序列继续有序. 对于直接插入排序的思路:将要排序的元素保存,然后逐个和其前面的元素进行比较,如果前面的元素比其大,则将前面的元素后移一个. 时间复杂度为n*n void insert_sort(int a[],int n) { int i,j; int temp; for(i=1;i<n;i++) { temp = a[i]; j=i-1; while((j>=0)&& (temp<a[j]))

排序算法大集锦_插入类——直接插入排序

这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好.<算法导论>上面那个比喻,比做打扑克牌的插入新牌,就比较形象.所以这些博客就算是对自己的总结吧. #include <stdio.h> void InsertSort(int *m, int n) { int i,j,temp; for(i=1;i<n;i++) { temp=m[i]; j=i-1; while(j>=0 && te

排序算法大集锦_插入类——希尔(shell)排序

这一系列博客的特点就是--给出每趟排序的结果 本来想着好好写一下过程,弄个图片什么的,不过觉得网上的解析太多了,都比较好,所以这些博客就算是对自己的总结吧. #include <stdio.h> void ShellSort(int *m, int n) { int i,flag,gap; for(gap=n;gap!=1;) { gap/=2; do { flag=0; for(i=0;i<n-gap;i++) if(m[i]>m[i+gap]) { m[i]=m[i]^m[i+