数据结构之归并排序

归并排序包括自顶向下和自下向上两种方式:这里用的是自顶向下的方法。即先分再合并。

引自:http://blog.csdn.net/middlekingt/article/details/8446552#comments

import java.util.Arrays;

public class mercySort {  
    /**
     * 归并排序
     * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列
     * 时间复杂度为O(nlogn)
     * 稳定排序方式
     * @param nums 待排序数组
     * @return 输出有序数组
     */  
    public static void sort(int[] nums, int low, int high) {  
        int mid = (low + high) / 2;  
        if (low < high) {  
              
            sort(nums, low, mid);     // 左边
            
            sort(nums, mid + 1, high);              //右边      ,数组还是一个数组,只是将他分为两个部分(以mid为界),那么low 和 high是不变的
              
            merge(nums, low, mid, high);         //合并左右,这里的递归是排序的主要方法,主要是弄清楚调用之间的关系
        }  
        return ;                      //这里排序,并不需要返回值   递归:将原问题转化到子序列问题,然后到最后单个元素,比较,然后合并。

//在哪里设置断点,程序在哪开始运行,观察变量的变化。
    }  
    public static void merge(int[] nums, int low, int mid, int high) {  
        int[] temp = new int[high - low + 1];  
        int i = low;// 左指针  
        int j = mid + 1;// 右指针  
        int k = 0;  
 
        // 把较小的数先移到新数组中  
        while (i <= mid && j <= high) {  
            if (nums[i] < nums[j]) {  
                temp[k++] = nums[i++];  
            } else {  
                temp[k++] = nums[j++];  
            }  
        }  
 
        // 把左边剩余的数移入数组  
        while (i <= mid) {  
            temp[k++] = nums[i++];  
        }  
 
        // 把右边边剩余的数移入数组  
        while (j <= high) {  
            temp[k++] = nums[j++];  
        }  
 
        // 把新数组中的数覆盖nums数组  
        for (int k2 = 0; k2 < temp.length; k2++) {  
            nums[k2 + low] = temp[k2];  
        }  
    }  
 
      
    // 归并排序的实现  
    public static void main(String[] args) {  
 
        int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 };  
 
        mercySort.sort(nums, 0, nums.length-1);  
        System.out.println(Arrays.toString(nums));  
    }  
}

时间: 2025-01-11 17:57:37

数据结构之归并排序的相关文章

数据结构实践——归并排序算法的改进

本文是针对[数据结构基础系列(9):排序]的项目. [项目 - 归并排序算法的改进] 采用归并排序.快速排序等高效算法进行排序,当数据元素较少时(如n≤64),经常直接使用直接插入排序算法等高复杂度的算法.这样做,会带来一定的好处,例如归并排序减少分配.回收临时存储区域的频次,快速排序减少递归层次等. 试按上面的思路,重新实现归并排序算法. [参考解答] #include <stdio.h> #include <malloc.h> #include <stdlib.h>

数据结构排序-归并排序

归并排序是建立在归并操作上的一种有效的排序算法,时间复杂度是O(nlogn). 它过程为:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1:否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元,如下图所示. 1 #include <stdio.h> 2 #include <stdlib.h&g

一天一学数据结构之归并排序

将若干个有序序列进行两两合并,直到所有待排记录都在一个有序序列为止. 1.二路归并排序 对于任意一个给定长度为n的待排序列,其中的n个记录各自为一个有序序列(单个记录必定是有序的),然后把相邻的两个序列归并,组成一个新的有序序列,一次下去,直到归并成一个有序序列为止. 把两个有序序列归并,数组arr归并前的序列,把归并后的有序序列放入数组arr1中.begin为第一个有序序列的第一个记录下标,middle为第一个有序序列的最后一个记录下标,middle+1为第二个有序序列的第一个记录下标,end

数据结构之--归并排序的实现

归并排序,是一种稳定的排序,使用了分治的思想,把一个数组对半划分,分别排序,再合并为一个新的数组. 代码实现如下: import java.util.Arrays; public class MergeSort { public static int[] sort(int[] nums, int low, int high) { int mid = (low + high) / 2; if (low < high) { // 左边 sort(nums, low, mid); // 右边 sort

数据结构之——归并排序

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列.归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序.若将两个有序表合并成一个有序表,称为2-路归并. 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一

python 数据结构之归并排序

def merger_sort(alist): if len(alist) <= 1 : return alist num=int(len(alist)/2) left=merger_sort(alist[:num]) right=merger_sort(alist[num:]) #分前后两个顺序 return merger(left,right) def merger(left,right): l,r=0,0 result = [] # 存放结果 while l < len(left) an

数据结构:归并排序

将两个的有序数列合并成一个有序数列,我们称之为"归并".归并排序(Merge Sort)就是利用归并思想对数列进行排序.根据具体的实现,归并排序包括"从上往下"和"从下往上"2种方式. 1. 从下往上的归并排序:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并:得到若干个长度为2的有序数列,再将这些数列两两合并:得到若干个长度为4的有序数列,再将它们两两合并:直接合并成一个数列为止.这样就得到了我们想要的排序结果.(参考下面的图片

数据结构_归并排序

//归并排序 class ArrayList { constructor () { this.array = [] } insert (data) { return this.array.push(data) } mergeSort () { this.array = this.merge_1(this.array) } //辅助函数1:分数组,直到一个数为一个数组 merge_1 (arr) { //获取数组长度 let length = arr.length if (length > 1)

Summary

PDF 暑假开始准备转移博客,试了几个都不怎么满意(我还去试了下LineBlog 不知道那时候在想什么..) 现在暂时转移至WordPress,不过还在完善中,预计..算了不瞎预计的好.. 课上说最好做个代码集,嗯嗯 我也觉得挺有必要的 毕竟现在我连Floyd怎么写都忘了 无脑SPFA_(:з」∠)_ 反正有用没用都稍微写一下,暂定是目录这些,有些还在找例题.整理代码什么的,所以还是空的. GItHub上还欠了几题,之后会补上来. 我做的二级目录到博客园就被无视了,,将就看看吧 感觉实在简陋了些