1,介绍
归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分为一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案“修复”在一起)
2,思路示意图
3,代码
/**********归并排序************/ @Test public void test12(){ int[] array = {8,4,5,7,1,3,6,2}; int[] tmp=new int[array.length]; mergeSort(array, 0, array.length-1, tmp); System.out.println(Arrays.toString(array)); } void mergeSort(int[] array, int left, int right, int[] tmp){ if (left <right){ int mid =(left + right)/2; //向左递归进行分解 mergeSort(array, left, mid, tmp); //向右递归进行分解 mergeSort(array, mid + 1, right, tmp); //合并 merge(array, left, right, mid, tmp); } } /** * 合并方法 * @param array 原始数组 * @param left 左边索引 * @param right 右边索引 * @param mid 中间索引 * @param tmp 临时数组 */ void merge(int[] array, int left, int right, int mid, int[] tmp){ int i = left; int j = mid + 1; int t = 0; // 1 // 把左右两边的数组按照顺序填充到tmp临时数组,直到左右两边有其中一边处理结束 while (i <= mid && j <= right) { //左边元素小于当前值,填充到tmp数组 if (array[i] <= array[j]) { tmp[t] = array[i]; t++; i++; } else {//右边元素小于当前值,填充到tmp数组 tmp[t] = array[j]; t++; j++; } } // 2 //把有剩余数据的一边的数据依次全部填充到temp while (i <= mid) { tmp[t] =array[i]; i++; t++; } while (j <= right) { tmp[t] =array[j]; j++; t++; } // 3 //将temp数组的元素拷贝到array注意,并不是每次都拷贝所有; t = 0; int tmpLeft =left; while (tmpLeft <= right){ array[tmpLeft] = tmp[t]; t+=1; tmpLeft+=1; } }