public class MergeSort {
/*
//相对好理解的merge算法
public void Merge(int low,int mid,int high,int []array) {
int i = low; // i是第一段序列的下标
int j = mid + 1; // j是第二段序列的下标
int k = 0; // k是临时存放合并序列的下标
int[] array2 = new int[high - low + 1]; // array2是临时合并序列
// 扫描第一段和第二段序列,直到有一个扫描结束
while (i <= mid && j <= high) {
// 判断第一段和第二段取出的数哪个更小,将其存入合并序列,并继续向下扫描
if (array[i] <= array[j]) {
array2[k] = array[i];
i++;
k++;
} else {
array2[k] = array[j];
j++;
k++;
}
}
// 若第一段序列还没扫描完,将其全部复制到合并序列
while (i <= mid) {
array2[k] = array[i];
i++;
k++;
}
// 若第二段序列还没扫描完,将其全部复制到合并序列
while (j <= high) {
array2[k] = array[j];
j++;
k++;
}
// 将合并序列复制到原始序列中
for (k = 0, i = low; i <= high; i++, k++) {
array[i] = array2[k];
}
}
*/
//合并
public static int[] merge(int low,int middle,int high,int []array){
int arrLength=array.length;
int []tempArr=new int[arrLength];
//要合并的左右两半拷贝到tempArr中
for(int i=low;i<=high;i++){
tempArr[i]=array[i];
}
int arrLeft=low;
int arrRight=middle+1;
int current=low;
//遍历数组,比较左右两半的元素将较小的元素复制到原先的数组中
while(arrLeft<=middle&&arrRight<=high){
if(tempArr[arrLeft]<=tempArr[arrRight]){
array[current]=tempArr[arrLeft];
arrLeft++;
}else{
array[current]=tempArr[arrRight];
arrRight++;
}
current++;
}
//剩余部分复制到目标数组
//若是右边剩了则右边原本就在原来的数组中,故不用复制,若是左边剩余则将剩余部分复制到目标数组
int remaining=middle-arrLeft;
for(int i=0;i<=remaining;i++){
array[current+i]=tempArr[arrLeft+i];
}
return array;
}
public static int[] mergeSort(int []array,int low,int high){
if(low<high){
int middle=(low+high)/2;
mergeSort(array,low,middle);
mergeSort(array,middle+1,high);
return merge(low,middle,high,array);
}
return array;
}
public static void main(String[] args) {
//2,4,56,23,45,67,78,3,1
int []array={0,1,2,7,45,8,21,81,-1,0,9,41,98,26,17,67,89,34,23,12,20};
int []arr=MergeSort.mergeSort(array, 0, array.length-1);
for(int i=0;i<array.length;i++){
System.out.println(arr[i]);
}
}
}
排序之归并排序java版
最新推荐文章于 2024-05-21 10:23:42 发布