归并排序
归并排序是将原始数组拆分成若干个子序列,将子序列排序完以后再合并起来。
public static int [] mergrSort(int[] arr){
Sort(arr,0,arr.length-1);
return arr;
}
public static void Sort(int[] arr,int left,int right){
//判断数组中有几个元素,如果只有一个元素,那是有序的,下标不合理会出现数组下标越界
if(left >= right){
return;
}
//取出数组的中间元素,并保存
int mid = (left + right)/2;
//递归循环中间元素的左边
Sort(arr,left,mid);
//递归循环中间元素的右边
Sort(arr,mid+1,right);
//将分开的数组有序的合并起来
//调用合并方法
merge(arr,left,mid,right);
}
public static void merge(int [] arr,int left,int center,int right){
//建立一个空数组,来临时存储排序的数组
int [] tempArr = new int[arr.length];
//临时数组的索引,并赋值,用于随时增加
int t = left;
//临时数组的索引,用于最后临时数组向arr数组中移动元素中
int tmp = left;
//右边数组的第一个下标
int mid =center +1;
while (left <= center && mid <= right){
if(arr[left]<= arr[mid]){//左边数组元素小于右边
tempArr[t++] = arr[left++];//将左边小的数组放进临时数组中,并向后移动索引
}
else{
tempArr[t++] = arr[mid++];//将右边较小的元素放进临时数组中,并向后移动索引
}
}
//将左边数组剩下的元素放进临时数组中
while(left <= center){//等号不能忘记
tempArr[t++] =arr[left++];
}
//将右边数组中剩余的元素放进临时数组中
while (mid <=right){
tempArr[t++] = arr[mid++];
}
//将临时数组中元素放进原数组arr里
while(tmp<=right){
arr[tmp] = tempArr[tmp++];
}
}