`
java--hhf
  • 浏览: 309129 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

大范围归并小范围插入排序

阅读更多

首先介绍归并和插入的算法思想,其实现细节可以参考博客http://java--hhf.iteye.com/blog/2034925/,然后再具体实现本文主要介绍的“大范围归并小范围插入排序”

(一)插入排序

算法执行思路如图

 实现算法:


 

(二)归并排序(分治法)

先将源数据分成一个一个的小组,然后两两合并即是

 

合并两个数据的实现思路:(将L,R合并为A返回)


时间复杂度


(三)


/**
 * 先插入排序再归并
 * 时间复杂度 nk+nlg(kn)
 * @author HHF
 * 2014年11月24日
 */
public class MergeInsert {
        private static final int k = 1000;
	public static void main(String[] args) {
		int[] array = Common.random(0,10000,1000);
		System.out.print("原始数据:");
		Common.printIntoTxt(array);
		sort(array1, 0, array1.length-1);;
		System.out.print("结果数据:");
		Common.printIntoTxt(array);
	}
	
	public static void sort(int[] array, int start, int end) {
		if(start+k < end){//已经递归到了最后 每个集合里面自由一个元素
			int middle = (end+start)/2;
			sort(array, start, middle);
			sort(array, middle+1, end);
			merge(array, start, middle, end);
		}else{
			insert(array, start, end);
		}
	}
	/**
	 * 插入排序
	 * @param array
	 * @param end 
	 * @param start 
	 */
	public static void insert(int[] array, int start, int end){
		//从第二个开始 往上找下标比它小的数进行比较
		int size = end-start+1;
		for(int i=1; i<size; i++){
			for(int j=i-1; j>=0; j--){
				if(array[start+j+1]<array[start+j]){//找到了i的正确位置 为j+1
					Common.swap(array, start+j+1, start+j);
				}
			}
			//Common.print(array);
		}
	}
	/**
	 * 将两个数组合并
	 * @param array
	 * @param array2
	 * @return 是否成功合并
	 */
	private static Boolean merge(int[] array, int start, int middle, int end) {
		int size1 = middle - start + 1;//[start, middle]
		int size2 = end - middle;//(middle, end]
		int[] array1 = new int[size1];
		int[] array2 = new int[size2];
		int i=0, j=0, k=start;
		while(i<size1){//获取到array数组左边的值
			array1[i] = array[start+i];
			i++;
		}
		while(j<size2){//获取到array数组右边的值
			array2[j] = array[middle+1+j];
			j++;
		}
		i=j=0;
		while(i<size1 && j<size2){//将两者中数据插入到新的数组中去
			if(array1[i]<array2[j]){
				array[k++] = array1[i];
				i++;
			}else{
				array[k++] = array2[j];
				j++;
			}
		}
		//收拾还剩余的数据
		if(i<size1){
			while(i<size1){
				array[k++] = array1[i];
				i++;
			}
		}
		if(j<size2){
			while(j<size2){
				array[k++] = array2[j];
				j++;
			}
		}
		array1 = null;
		array2 = null;
		if(k == end+1){
			return true;
		}else{
			return false;
		}
	}	
}

 
 (四)内排序下界



 堆排序具体实现可以参考博客http://java--hhf.iteye.com/blog/2034925/

(ps:附件内附上工具类Common.zip)

  • 大小: 31.3 KB
  • 大小: 11.4 KB
  • 大小: 6.3 KB
  • 大小: 12.2 KB
  • 大小: 47.8 KB
  • 大小: 5.7 KB
  • 大小: 22.4 KB
  • 大小: 865 Bytes
  • 大小: 20.9 KB
  • 大小: 3.7 KB
  • 大小: 4.2 KB
  • 大小: 3.6 KB
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics