码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序 java

时间:2020-10-06 19:54:22      阅读:28      评论:0      收藏:0      [点我收藏+]

标签:oid   port   归并   完成   数组   main   ges   左右   from   

/*
* 归并排序思路:
* 1.将一个数列 先分后治
* 先对半分,数列对半分,分到最后一个,然后在两两治,合并成一个有序列
* 在从2个有序列合并一个有序,知道合并完成
*
* */

import java.util.Arrays;
public class MergetSort {
public static void main(String[] args) {
int []arr = {7,5,68,1,4,0};
int temp[] = new int[arr.length];//额外的数组
mergeSort(arr,0,arr.length - 1,temp);

System.out.println(Arrays.toString(arr));
}
//分+合
public static void mergeSort(int[] arr,int left,int right,int[] temp){
if(left < right){
int mid = (left+right) /2; //中间索引
mergeSort(arr, left, mid, temp);
//向左递归分解
mergeSort(arr, mid+1, right, temp);
//向右递归分解
merge(arr,left,mid,right,temp);
}
}


//合并
public static void merge(int[] arr,int left,int mid,int right,int[] temp){
int i = left;//左边有序的初始索引
int j = mid;//右边有序的初始索引
int t = 0;//指向temp数组的当前索引

//(一)将左右2个有序放到temp中
//直到有一边数列处理完
while(i <= mid && j <=right){
//如果左边有序当前元素 小于 右边有序当前元素
//将左边当前拷到temp
if(arr[i] <= arr[j]){
temp[t] = arr[i];
t += 1;
i += 1;
}else{//反之,将右边的当前元素拷贝到temp
temp[t] = arr[j];
t += 1;
j += 1;
}
}

//(二)把有剩余的放回到temp
while (i <= mid){
temp[t] = arr[i];
t += 1;
i += 1;
}
while (j <= right){
temp[t] = arr[j];
t += 1;
j += 1;
}

//(三)将temp数组拷arr\
// 注意不是每一次都拷贝
t = 0 ;
int tempLeft = left;
while (tempLeft <= right){
arr[tempLeft] = temp[t];
t += 1;
tempLeft += 1;
}

}
}

code from ----梁氏


归并排序 java

标签:oid   port   归并   完成   数组   main   ges   左右   from   

原文地址:https://www.cnblogs.com/liang-shi/p/13763066.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!