归并排序-递归实现

一、概念

主要思想:将若干有序序列逐步归并,最终归并为一个有序序列。

二路归并排序是归并排序中最简单的排序方法,其基本思想是:

将若干个有序序列进行两两归并,直至所有待排序记录都在一个有序序列为止。

二、复杂度

 

排序方法   最差时间分析  最好时间分析  平均时间复杂度  空间复杂度  稳定性
 归并排序  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 

 

冒泡排序

快速排序

选择排序

堆排序

插入排序

希尔排序(缩小增量排序)

基数排序

posted @ 2017-06-02 17:55  fankongkong  阅读(612)  评论(0编辑  收藏  举报