//归并排序入口
public void MegerSort(int[] lists) {
MyMegerSort(lists);
}
//递归调用的函数,原理:每次将数组平分为两个数组,递归下去,当每个数组仅包含一个元素时候,再递归合并
private void MyMegerSort(int[] lists) {
int length=lists.length;
if(length<=1) return ;
//Log.i(TAG,"拆分"+length);
int[] first_part=new int[length/2];
int[] second_part=new int[length-length/2];
System.arraycopy(lists, 0, first_part, 0, first_part.length);
System.arraycopy(lists, first_part.length, second_part, 0, second_part.length);
MyMegerSort(first_part);
MyMegerSort(second_part);
int[] temp=meger(first_part,second_part); //必须用一个新数组接收归并后的数组,让后拷贝到原数组中
System.arraycopy(temp, 0, lists, 0, length);
//Log.i(TAG,"归并回来的数组"+Arrays.toString(lists));
}
//递归合并
private int[] meger(int[] first_part, int[] second_part) {
int[] result=new int[first_part.length+second_part.length]; //构建一个新数组,进行数组拼接
int f_index=0,s_index=0;
int index=0;
//两个数组中总是将小的数值填充到归并后的数组
while(f_index<first_part.length&&s_index<second_part.length){
while(f_index<first_part.length&&s_index<second_part.length&&first_part[f_index]<=second_part[s_index]){
result[index++]=first_part[f_index++];
}
while(f_index<first_part.length&&s_index<second_part.length&&second_part[s_index]<first_part[f_index]){
result[index++]=second_part[s_index++];
}
}
while(f_index<first_part.length){
result[index++]=first_part[f_index++];
}
while(s_index<second_part.length){
result[index++]=second_part[s_index++];
}
return result;
}
排序算法之归并排序
最新推荐文章于 2023-06-10 18:23:18 发布