思路:
归并排序主要涉及2个方面:
1:将一个数组进行不断的分割,直到数组划分成1个单个数字。
2:将每个单个数字通过比较大小进行拷贝到1个新的数组中。
代码:
合并拷贝的merge方法:
通过三个指针(i,j,t),mid为数组的中间索引,
//传入要排序的数组, 左边的起始索引,中间索引,右边索引,作中转的数组
public static void merge(int[] arr,int left,int mid,int right,int[] temp){
//初始化左边的初始序列
int i = left;
//初始化j(右边序列的初始化索引位置)
int j = mid + 1;
//指向temp的初始索引
int t = 0;
//先把左右两边的数据按规则拷贝到temp去
//直到左右两边的有序序列,有一边处理完毕即可
while(i<=mid && j <= right){
if(arr[i] <= arr[j]){
temp[t] = arr[i];
t+=1;
i+=1;
}else{
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;
}
}
分割mergeSort方法:
//分割数组
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);
}
}
总代码:
/**
* 归并排序
* 思路:
* 先把数组进行分散,再把数组进行逐步比较合并成1个新的数组
*/
public class mergeSort {
public static void main(String[] args) {
int[] arr = {231,312,3,34,345,31,2};
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;
//初始化j(右边序列的初始化索引位置)
int j = mid + 1;
//指向temp的初始索引
int t = 0;
//先把左右两边的数据按规则拷贝到temp去
//直到左右两边的有序序列,有一边处理完毕即可
while(i<=mid && j <= right){
if(arr[i] <= arr[j]){
temp[t] = arr[i];
t+=1;
i+=1;
}else{
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;
}
}
}