归并排序算法思想
利用归并的思想实现排序的方法
原理:假设初始序列有N个记录,则可以看成是N个有序的子序列,每个子序列的长度为1,然后两两归并,得到N/2个长度为2或1的有序子序列,再两两归并,如此重复,直至的到一个长度为N的有序序列为止,这种排序方法称为2路归并排序。
package com.sort;
import java.util.Arrays;
//归并排序
public class Demo06 {
public static void main(String[] args) {
int[] arr={10,30,2,1,0,8,7,5,19,29};
//拆分
chaifen(arr,0,arr.length-1);
//归并
System.out.println(Arrays.toString(arr));
}
private static void chaifen(int[] arr, int startIndex, int endIndex) {
//计算中间索引
int centerIndex= (startIndex+endIndex)/2;
if(startIndex<endIndex){
chaifen(arr,startIndex,centerIndex);
chaifen(arr,centerIndex+1,endIndex);
guiBing(arr,startIndex,centerIndex,endIndex);
}
}
private static void guiBing(int[] arr,int startIndex,int centerIndex,int endIndex){
//定义一个临时数组
int[] tempArr=new int[endIndex-startIndex+1];
//定义左边数组的起始索引
int i=startIndex;
//定义右边数组的起始索引
int j=centerIndex+1;
定义临时数组的起始索引
int index =0;
//比较左右两个数组元素的大小,往临时数组中放
while(i<=centerIndex&&j<=endIndex){
if(arr[i]<=arr[j]){
tempArr[index]=arr[i];
i++;
}else{
tempArr[index]=arr[j];
j++;
}
index++;
}
//处理剩余元素
while(i<=centerIndex){
tempArr[index]=arr[i];
i++;
index++;
}
while(j<=endIndex){
tempArr[index]=arr[j];
j++;
index++;
}
//将临时数组中的元素取到原数组中
for(int k=0;k<tempArr.length;k++){
arr[k+startIndex]=tempArr[k];
}
}
}
输出:[0, 1, 2, 5, 7, 8, 10, 19, 29, 30]