归并排序介绍
方法示意图片:
思路:
1.归并排序起始思路: 先写一个左右两部分排好序的数组,然后先写出合并方法; 以{1,3,5,7,2,4,6,8} 为例去思考,左右两部分拍完,去合并;
2. 利用拆分与合并;实现归并排序;(思路难点);
代码
1.先写合并方法
/**归并排序重点思路:
*先写一个左右两部分排好序的数组,然后先写出合并方法;
* 以{1,3,5,7,2,4,6,8} 为例去思考,左右两部分拍完,去合并;
* @param arr
* @param leftbound 下标(包括) 下例的0
* @param rightbound 右边界下标(不包括) 下例的8
*/
private static void mergeSort(int[] arr, int leftbound, int rightbound) {
int i=leftbound;//左边指针
int j=(rightbound+leftbound)/2;//中间那个指针
int mid=j;//记录值,后续做部分的界限;
int[] temp=new int[rightbound-leftbound];//用来存值替换的数组;
int t=0;//temp数组指针,用来标记数值排到temp数组的位置
/**
* 假设有两块排好的数组
*/
while (i<mid&&j<rightbound){
if (arr[i]<arr[j]){
temp[t++]=arr[i++];//把小的值付给temp数组,i、t向后移;
}else {
temp[t++]=arr[j++];
}
}
//接下来看看哪个部分没取出完,将剩余的直接全放入temp;
while (i<mid) temp[t++]=arr[i++];
while (j<rightbound) temp[t++]=arr[j++];
//此时,temp以排好序;将temp赋值给arr;
//注意,temp可能是是arr一部分
for (int val:temp) {
arr[leftbound]=val;
leftbound++;
}
}
2.再写归并排序方法
归并排序方法,即先递归进行分拆分;
然后进行合并;
private static void myMergeSort(int[] arr, int left, int right) {
//只要大于1个就分解,即调用方法本分(用传入参数将该片段分为左右部分)
if (right-left>1){
myMergeSort(arr, left, (right+left)/2);
myMergeSort(arr, (right+left)/2, right);
mergeSort(arr,left,right);
}
}
3.测试方法
public static void main(String[] args) {
//创建随机数组测试
int[] arr=new int[10];
for (int i = 0; i < 10; i++) {
arr[i]= (int) (Math.random()*8000);
}
//执行全速排序
myMergeSort(arr,0,arr.length);
//输出结果;
System.out.println(Arrays.toString(arr));
}
结果: