归并排序:
归并排序是一种递归排序算法,通过将列表递归分成两半直到每一个子列表都只含有一个元素,然后将这些子列表按顺序重组,这样就完成了对整个列表的排序。排序策略:
1.将列表分成两个大约相等的子列表;2.对每个子列表递归调用自身;
3.当整个列表被分成长度都为1的子列表时,归并排序的分解步骤完成;
4.递归将两个子列表整合成一个排好序的子列表;
5.当所有子列表归并完成,整个列表即完成排序。
例子:
分解部分:
归并部分:
Code:
/*
*Created on 2016年7月11日
*Copyright 2016 Yong Cai Limited crop. All Rights Reserved
*
*/
package org.cy.sort;
public class MergeSort {
public static void main(String[] args) {
String[] str = {"nba", "haha", "zxy", "test", "abc"};
printArr(mergeSort(str, 0, str.length - 1));
}
public static <T extends Comparable<T>> T[] mergeSort(T[] data, int minIndex, int maxIndex){
if(minIndex < maxIndex){
int mid = (minIndex + maxIndex) / 2;
mergeSort(data, minIndex, mid);
mergeSort(data, mid + 1, maxIndex);
mergeSort(data,minIndex,mid,maxIndex);
}
return data;
}
public static <T extends Comparable<T>> void mergeSort(T[]data, int first, int mid, int last){
T[] tmp = (T[])(new Comparable[data.length]);
int first1 = first;
int last1 = mid;
int first2 = mid + 1;
int last2 = last;
int index = first1;
while(first1 <= last1 && first2 <= last2){
if(data[first1].compareTo(data[first2]) < 0){
tmp[index] = data[first1];
first1++;
}else{
tmp[index] = data[first2];
first2++;
}
index++;
}
while(first1 <= last1){
tmp[index] = data[first1];
first1++;
index++;
}
while(first2 <= last2){
tmp[index] = data[first2];
first2++;
index++;
}
for(index = first;index <= last; index++){
data[index] = tmp[index];
}
}
public static <T> void printArr(T[] data){
int len = data.length;
for(int i = 0; i < len; i++){
System.out.print(data[i] + " ");
}
System.out.println();
}
}