归并排序-递归实现
一、概念
主要思想:将若干有序序列逐步归并,最终归并为一个有序序列。
二路归并排序是归并排序中最简单的排序方法,其基本思想是:
将若干个有序序列进行两两归并,直至所有待排序记录都在一个有序序列为止。
二、复杂度
排序方法 | 最差时间分析 | 最好时间分析 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 稳定 |
三、代码实现
1 //归并排序的递归算法实现 2 public class MergeSort2 { 3 int count = 1; 4 /** 5 * 一次归并算法 6 * @param array 数组 7 * @param start 存放 开始 的位置指针,指的是array中的数组 8 * @param mid 存放 中间 的位置指针,指的是array中的数组 9 * @param end 存放 末尾 的位置指针,指的是array中的数组 10 */ 11 public void merge(int array[], int start, int mid , int end){ 12 int[] temp = new int[end-start+1];//辅助数组 13 int i = start, //s-m 为 array中的前半部分 14 j = mid+1, //m+1-t 为 array 的后半部分 15 k = 0; //k为temp中的数组指针 16 while(i <= mid && j <= end){ 17 if(array[i] <= array[j]) 18 temp[k++] = array[i++]; 19 else 20 temp[k++] = array[j++]; 21 } 22 //当前部分还有数据时 23 if(i <= mid){ 24 while(i<=mid) 25 temp[k++] = array[i++]; 26 }else{ 27 //当后半部分还有数据时 28 while(j<=end) 29 temp[k++] = array[j++]; 30 } 31 //每次排序后 ,将temp的排好序的个数存储到array中 32 for(int v = 0; v < k; v++) 33 array[start+v] = temp[v]; 34 } 35 /** 36 * 37 * @param array 需要排序的数组 38 * @param start 开始位置 a 39 * @param end 结束位置 a 40 */ 41 void mergeSort(int array[], int start,int end){ 42 int mid = (start + end)/2;//中间位置 43 //递归结束条件 44 if(start < end){ 45 mergeSort(array,start,mid);//左边,递归 46 mergeSort(array,mid+1,end);//右边,递归 47 merge(array,start,mid,end);//左右归并 48 printArray(array,count++); 49 } 50 } 51 //打印每次排序的结果 52 public void printArray(int a[],int count){ 53 if(count != 0) 54 System.out.print("第" + count + "次 "); 55 for(int m = 0; m < a.length; m++){ 56 System.out.print(a[m] + " "); 57 } 58 System.out.println(); 59 } 60 public static void main(String[] args) { 61 MergeSort2 ms = new MergeSort2(); 62 int array[] = {7, 2, 8, 3, 1, 6, 9, 0, 5, 4}; 63 ms.mergeSort(array, 0, array.length-1); 64 } 65 }
四、代码运行结果
1 第1次 2 7 8 3 1 6 9 0 5 4 2 第2次 2 7 8 3 1 6 9 0 5 4 3 第3次 2 7 8 1 3 6 9 0 5 4 4 第4次 1 2 3 7 8 6 9 0 5 4 5 第5次 1 2 3 7 8 6 9 0 5 4 6 第6次 1 2 3 7 8 0 6 9 5 4 7 第7次 1 2 3 7 8 0 6 9 4 5 8 第8次 1 2 3 7 8 0 4 5 6 9 9 第9次 0 1 2 3 4 5 6 7 8 9