今天研究了一下归并排序,原理是这样的:
将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列
综合并运用递归和归并的方法:
代码是这样的:
/**
* 归并排序
*/
package algorithm;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public static void mergeSort(int[] data) {
sort(data, 0, data.length - 1);
}
public static void sort(int[] data, int left, int right){
if(left >= right)
return;
int center = (left+right) / 2;
sort(data, left, center); //递归排序左子序列
sort(data, center+1, right); //递归排序右子序列
merge(data, left, center, right); //左右子序列(已排好序)合并
}
public static void merge(int[] data, int left, int center, int right){
int[] tempArr = new int[data.length];
int mid = center+1; //右边数组第一个元素索引
int index = left; //记录临时数组的索引
int tmp = left; //缓存左数组第一个元素的索引
while(left <= center && mid <= right){
if(data[left] <= data[mid]){
tempArr[index++] = data[left++];
}else{
tempArr[index++] = data[mid++];
}
}
while(mid <= right)
tempArr[index++] = data[mid++];
while(left <= center)
tempArr[index++] = data[left++];
//临时数组中数拷贝到原数组中
while(tmp <= right)
data[tmp] = tempArr[tmp++];
}
}
总体来说,思路还是比较清晰的!