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 

    冒泡排序

    快速排序

    选择排序

    堆排序

    插入排序

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

    基数排序

  • 相关阅读:
    flask之闪现
    对于Flask中蓝图的理解
    flask中的CBV和FBV
    Flask之基本使用与配置
    Flask
    Flask-信号(blinker)
    flask-migrate
    Flask WTForms的使用和源码分析 —— (7)
    mac下卸载jdk
    RabbitMQ五种消息队列学习(三)–Work模式
  • 原文地址:https://www.cnblogs.com/fankongkong/p/6934250.html
Copyright © 2011-2022 走看看