文章参考了博文“白话经典算法”(http://blog.csdn.net/morewindows/article/details/6678165/)。
归并是把两个已排序文件合并成一个更大的已排序文件的过程,而相比之下,选择是把一个文件分成包含k个最小元素和n-k个最大元素两部分的过程。归并排序适用于链表排序。
算法的主体部分如下,通过递归,将原序列分化成子序列:
void MergeSort(int A[], int temp[], int left, int right){
int mid;
if(right>left){
mid = (right+left)/2;
MergeSort(A,temp,left,mid);
MergeSort(A,temp,mid+1,right);
Merge(A,temp,left,mid+1,right);
}
}
算法的合并部分如下,注意的是left-mid-1和mid-right都是已经排好序的:
void Merge(int[] A, int[] temp, int left, int mid, int right) {
// TODO Auto-generated method stub
int i, left_end, size, temp_pos;
left_end = mid-1;
temp_pos = left;
size = right-left+1;
while( (left<=left_end) && (mid<=right) ){
if(A[left] <= A[mid]){
temp[temp_pos] = A[left];
temp_pos = temp_pos+1;
left = left+1;
}
else{
temp[temp_pos] = A[mid];
temp_pos = temp_pos + 1;
mid = mid + 1;
}//else
}
while(left <= left_end){
temp[temp_pos] = A[left];
left = left + 1;
temp_pos = temp_pos + 1;
}
while(mid <= right){
temp[temp_pos] = A[mid];
mid = mid + 1;
temp_pos = temp_pos + 1;
}
for(i=0;i<size;i++){
A[right] = temp[right];
right = right-1;
}
}
测试代码如下:
public static void main(String[] args) {
int[]A = {12,23,34,2,34,66,15};
int[] temp = new int[A.length];
MergeSort(A,temp,0,A.length-1);
for(int i=0;i<A.length;i++)
System.out.println(A[i]);
}