归并排序(升序)

1、算法

将若干个有序的序列进行两两合并,知道全部记录归并到一个序列。具体过程:将n个记录的待排序序列看成n个子序列,然后把他们两两归并,接着把长度为2的n/2个子序列再次归并,重复上述过程,直到有序为止。

2、算法实现

package test;

public class MergeSort {  

    public static void main(String[] args) {
        int[] n ={1,3,6,2,9,6,8,7};
        mergesort(n,0,n.length-1);
        for (int i : n) {
            System.out.print(i+"\t");
        }
    }  

    public static int[] mergesort(int[] nums, int low, int high) {
        int mid = (low + high) / 2;
        if (low < high) {
            mergesort(nums, low, mid);
            mergesort(nums, mid + 1, high);
            merge(nums, low, mid, high);
        }
        return nums;
    }  

    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++];
        }  

        for (int k2 = 0; k2 < temp.length; k2++) {
            nums[k2 + low] = temp[k2];
        }
    }  

}  
时间: 2024-08-09 21:45:48

归并排序(升序)的相关文章

python八大排序算法

print("冒泡排序") def bubbleSort(input_list): ''' 函数说明:冒泡排序(升序) :param input_lis: 待排序列表 :return:sorted_list :升序排好的列表 ''' if len(input_list) == 0: return [] sorted_list = input_list for i in range(len(sorted_list)-1): bchanged =False # print("第%

排序杂谈

最近正好计导和c语言都讲到排序问题,以前都是了解概念之后直接用sort,这次把各种排序算法都代码实现一下. 题目传送门 插入排序 把序列分成两部分,前一部分为已排好序部分,后一部分未排序.(初始1~1为已排序部分,2~n为未排序部分) 然后从未排序部分中取一个数,将其加入已排序部分的对应位置中. 代码实现: 1 // 插入排序 升序 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #includ

插入排序与归并排序

前言: 排序算法应该算是算法入门级的东西了,这里重新学习算法,先暂时归纳下个人对两种算法的理解. 插入排序: 插入排序可以对应到现实生活中的排队去停车场停车的场景.假设某家饭店的饭菜十分好吃(流口水),导致来这里吃饭的人特别多,后面来吃饭准备停车的车排起了长队.每次只允许一辆车过去找位置,找到位置之后才允许下一辆车进入,依此类推,直到所有的车都停好.转换成专业的数学模型就是:现有一个无序数组 A[n],要想对其进行排序.我们先从一个数开始考虑,A0肯定是排好序的.现在假设有A1,那么这时候应该将

poj 2299 Ultra-QuickSort 归并排序求逆序数对

题目链接: http://poj.org/problem?id=2299 题目描述: 给一个有n(n<=500000)个数的杂乱序列,问:如果用冒泡排序,把这n个数排成升序,需要交换几次? 解题思路: 根据冒泡排序的特点,我们可知,本题只需要统计每一个数的逆序数(如果有i<j,存在a[i] > a[j],则称a[i]与 a[j]为逆序数对),输出所有的数的逆序数的和用普通排序一定会超时,但是比较快的排序,像快排又无法统计 交换次数,这里就很好地体现了归并排序的优点.典型的利用归并排序求逆

基本排序算法Java实现(2)——归并排序

归并排序:升序排 private <T extends Comparable<? super T>> void mergeSortByAsc(T[] data, int low,int high) { T[] temp; /** 如果左右相等,则返回 */ if(low == high) return; /** 找到长度和中间的那个数*/ int size = high - low +1; int mid = (low + high)/2; temp = (T[])(new Com

ACM第二站————归并排序

转载请注明出处,谢谢!http://www.cnblogs.com/Asimple/p/5459664.html 归并排序————二分的思想 以中间的数为基准,每次排序都将比其小[升序排](大[降序排])的数放在前面,将比其大(小)的数放在后面. 一直重复,知道只有一个数的时候,自然有序. 最后合并分好的有序区间. 总体就是:组间无序,组内有序. 代码如下[升序]: #include <stdlib.h>#include <stdio.h>#define MAX 1000001 i

常用算法之排序算法四【归并排序】

归并排序是将排好序的序列逐步合成一个大序列的算法,从字面上来分析,主要分为归并和排序. 算法描述: 1.申请一块空间,大小为两个排好序序列长度之和,用来存放归并后的序列. 2.设两个指针,分别指向两个已经排好序的序列的起始地址. 3.比较两个指针指向位置的值大小,根据升序降序,选择较小值或者较大值存储在合并空间内,并将相应指针后移. 4.重复3操作,直至指针移至序列尾部. 5.将另一个序列的值全部合并至合并序列中. 先抛开描述,说说自己的理解,就是把一个短有序序列合并成一个新的长有序序列,就是它

疯狂的Java算法——插入排序,归并排序以及并行归并排序

从古至今的难题 在IT届有一道百算不厌其烦的题,俗称排序.不管是你参加BAT等高端笔试,亦或是藏匿于街头小巷的草根笔试,都会经常见到这样一道百年难得一解的问题. 今天LZ有幸与各位分享一下算法届的草根明星,排序届的领衔大神——插入排序以及归并排序.最后,在头脑风暴下,LZ又有幸认识了一位新朋友,名叫并行归并排序.接下来,咱们就一一认识一下,并且在最后来一次“算林大会”吧. 插入排序简介 插入排序,算林称最亲民的排序算法,插入排序采用最简单的插入方式对一个整数数组进行排序.它循环数组中从第二个开始

ZJNU 1247 归并排序求逆序对

逆序对——高级 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 118   Accepted: 28 Description 对于一个包含N个非负整数的数组A[1..n],如果有i < j,且A[ i ]>A[ j ],则称(A[ i] ,A[ j] )为数组A中的一个逆序对.  例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个. 求n个数中的逆序对个数. Input 第一