- 归并排序
原理:归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略,分而治之,将无序的原始数据分开排序后,再将若干个已排好序的部分合并成一个有序的部分。
该算法需要申请空间,每一次操作后都需要记得移动角标向后存储,最后再将其放回原始数组。算法采用递归实现,分开处理最后归并,分而治之。
归并排序:
public static void mergeSort(int[] arr,int low,int high) {
int middle = (high+low)/2;
if(low<high) {
//处理左边
mergeSort(arr,low,middle);
//处理右边
mergeSort(arr,middle+1,high);
//归并
merge(arr,low,middle,high);
}
}
归并数组:
public static void merge(int[] arr,int low,int middle,int high) {
//用于存储归并后的临时数组
int[] temp = new int[high-low+1];
//记录第一个数组中需要遍历的下标
int i = low;
//记录第二个数组中需要遍历的下标
int j = middle+1;
//用于记录在临时数组中存放的下标
int index = 0;
//遍历两个数组取出小的数字,放入临时数组中
while(i<=middle&&j<=high) {
if(arr[i]<=arr[j]) {
//把小的数据放入临时数组中
temp[index] = arr[i];
//把下标向后移动一位
i++;
}else {
temp[index] = arr[j];
j++;
}
//每次循环向临时数组插入数据就向后移动记录角标
index++;
}
//处理多余的数据
while(j<=high) {
temp[index] = arr[j];
j++;
//向后移动记录角标
index++;
}
while(i<=middle) {
temp[index] = arr[i];
i++;
//向后移动记录角标
index++;
}
//把临时数组中的数据重新存入原数组
for(int k=0;k<temp.length;k++) {
arr[k+low] = temp[k];
}
}