归并排序算法可以递归的描述为:算法将数组分为两半,对每部分递归地应用归并排序。在两部分都排好序后,对它们进行归并。
package ss.sort;
/**
* 归并排序
* @author zhangss 2016-4-26 14:06:04
* */
public class MergeSort {
/**
* @param args
*/
public static void main(String[] args) {
int[] list = {2, 3, 2, 5, 6, 1, -2, 3, 4, 14, 12};
mergeSort(list);
for(int temp : list)
System.out.println(temp);
}
public static void mergeSort(int[] list){
if(list.length>1){
// marge sort the first half
int[] firstHalf = new int[list.length/2];
System.arraycopy(list, 0, firstHalf, 0, list.length/2);
mergeSort(firstHalf);
// marge sort the secode half
int secondHalfLength = list.length - list.length/2;
int[] secondHalf = new int[secondHalfLength];
System.arraycopy(list, list.length/2, secondHalf, 0, secondHalfLength);
mergeSort(secondHalf);
//Merge firstHalf with secondHalf
int[] temp = merge(firstHalf, secondHalf);
System.arraycopy(temp, 0, list, 0, temp.length);
}
}
/** Merge two sorted lists */
private static int[] merge(int[] list1, int[] list2){
int[] temp = new int[list1.length + list2.length];
int current1 = 0; // Current index in list1
int current2 = 0; // Current index in list2
int current3 = 0; // Current index in temp
while(current1<list1.length && current2 < list2.length){
if(list1[current1] < list2[current2]){
temp[current3++] = list1[current1++];
}else{
temp[current3++] = list2[current2++];
}
}
while(current1 < list1.length){
temp[current3++] = list1[current1++];
}
while(current2 < list2.length){
temp[current3++] = list2[current2++];
}
return temp;
}
}