首先介紹歸併和插入的算法思想,其實現細節可以參考博客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)