zoukankan      html  css  js  c++  java
  • 归并排序-递归实现

    一、概念

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

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

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

    二、复杂度

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

    冒泡排序

    快速排序

    选择排序

    堆排序

    插入排序

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

    基数排序

  • 相关阅读:
    mysq 日期相减
    说说时间观与时间管理——北漂18年(71)
    ionic之切换开关
    ionic之单选框
    SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE locks在RR模式下可以看到最新的记录
    14.5.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.5.2.2 autocommit, Commit, and Rollback
    14.5.2 事务隔离级别
    对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
    mysql explain 解释
  • 原文地址:https://www.cnblogs.com/fankongkong/p/6934250.html
Copyright © 2011-2022 走看看