归并排序算法实现

关于归并排序算法的思想,网上有很多介绍,这里不再解释,这里提供了一个Java类,读者可以把类潜入到自己的程序中,直接调用,免去了重新编写归并排序的过程。

具体的Java代码如下:

 1 import java.util.*;
 2 class Mergesort {
 3
 4          public static void merge(int a[],int start,int mid,int end){   //归并方法
 5              int  b[]=new int[a.length];                         //借助中间数组,用来暂存排序结果
 6              int i,j,k=start;
 7              i=start;j=mid+1;
 8
 9              while(i!=mid+1 && j!=end+1)                         //将两部分中小的数放入中间数组
10                  if(a[i]>=a[j])b[k++]=a[j++];
11                  else   b[k++]=a[i++];
12
13              while(i!=mid+1)b[k++]=a[i++];                       //将剩余的部分复制到数组
14              while(j!=end+1)b[k++]=a[j++];
15
16              for(i=start;i<=end;i++)                             //将中间排序结果复制到原数组
17                  a[i]=b[i];
18              b=null;                                             //通知虚拟机回收空间
19          }
20
21          public static void mergesort(int a[],int start,int end){
22              if(start<end){
23              int mid=(start+end)/2;
24              mergesort(a,start,mid);
25              mergesort(a,mid+1,end);
26              merge(a,start,mid,end);                              //归并递归调用
27              }
28          }
29     }
30
31 public class Test{                                             //测试类
32     public static void main(String[] args) {
33          Scanner scan=new Scanner(System.in);
34          int n=scan.nextInt();                                 //从键盘接受要排序的个数
35          int array[]=new int[n];                               //下标从0开始存数据的数组
36          System.out.print("排序前的数组:");
37          for(int i=0;i<n;i++)                                 //输出排序前的数组
38          {
39            array[i]=0+(int)(Math.random()*(100-0+1));         //随机生成0~100之间的整数
40            System.out.print(array[i]+",");
41          }
42              System.out.println();
43              Mergesort.mergesort(array,0,array.length-1);    //调用归并排序
44              System.out.print("排序后的数组:");                 //输出排序结果
45              for(int i=0;i<n;i++)
46                  System.out.print(array[i]+",");
47        }
48 }

在程序执行后,从键盘上输入10,输出结果为:
排序前的数组:50,21,66,1,49,63,78,5,62,24,
排序后的数组:1,5,21,24,49,50,62,63,66,78,

时间: 2024-09-29 02:28:12

归并排序算法实现的相关文章

必须知道的八大种排序算法【java实现】(三) 归并排序算法、堆排序算法详解

一.归并排序算法 基本思想: 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并排序示例: 合并方法: 设r[i-n]由两个有序子表r[i-m]和r[m+1-n]组成,两个子表长度分别为n-i +1.n-m. j=m+1:k=i:i=i; //置两个子表的起始下标及辅助数组的起始下标 若i>m 或j>n,转⑷ //其中一个子表已合并完,比较选取结束 //选取r[i]和r[j]

归并排序算法--java

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

算法之-归并排序算法

归并排序是效率还是比较高的算法.其中的分治法是常用的一种解决问题的方法,现在流行的云计算其实就是一种分治法的应用. 所谓的分治法,字面解释就是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个思想在实际工作中的作用非常大,特别是处理大数据和做复杂运算的时候. 归并排序的基础是归并操作merge,即将两个有序数组合并为一个有序数组. 归并排序的算法思路为: 第一次扫描数组,将数组中相邻的两个元素mer

递归分治算法(一)-归并排序算法

前言: 分治法是一种算法设计思想,所谓分治,意为分而治之,是指将一个难以直接解决的大问题,递归的分割成一些规模的较小的问题,以便逐个解决.采用分治法设计的算法通常用到递归算法来实现,故标题为递归分治. 归并排序算法 归并就是将两个或两个以上的有序表合并成一个新的有序表.归并排序就是将无序的待排序的序列分解成若干个有序的子序列,并把有序子序列合并为整体有序序列的过程.一般分为2-路归并排序和多路归并排序. 他的大概流程如下图: 我们来看看java代码怎么写的: package guibing; /

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

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

自底向上的归并排序算法

1.什么是自底向上的归并排序? 说到底,不管是前面说的自顶向下的归并排序还是现在讲的自底向上的归并排序,其实质都是归并. 来看看一个演示过程:          这个就是待排序的数组序列          先将数组序列以2个元素为一组分成4组,每个组内部分成2个子序列进行向上合并           这是合并之后的效果           然后以4个元素为一组分成2组,每个组内部分成2个子序列进行向上合并           这是合并之后的效果           然后以8个元素为一组分成1个组

算法之-归并排序算法,插入排序算法

一.归并排序法 归并排序是效率还是比較高的算法.当中的分治法是经常使用的一种解决这个问题的方法,如今流行的云计算事实上就是一种分治法的应用. 所谓的分治法,字面解释就是"分而治之",就是把一个复杂的问题分成两个或很多其它的同样或相似的子问题,直到最后子问题能够简单的直接求解.原问题的解即子问题的解的合并.这个思想在实际工作中的作用很大,特别是处理大数据和做复杂运算的时候. 归并排序的基础是归并操作merge,即将两个有序数组合并为一个有序数组. 归并排序的算法思路为: 第一次扫描数组,

Java算法学习-----------------归并排序算法

将数组中的相邻元素两两配对,用归并算法进行排序,构成n/2组长度为2的排好序的子数组段,然后再将其排成长度为4的子数组段,如此继续下去直到整个数组排好序. 按照此思想,消除递归后的归并排序算法(伪代码)如下: public class MergeSort { public static void mergeSort(Comparable[]a) { Comparable[]b=new Comparable[a.length]; int s=1; while (s<a.length) { merg

指针实现时间复杂度为O(n*logN)的排序算法(归并排序算法)

归并排序 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* sortList(ListNode* head) { 12 //排序算法 空间复杂度N*lo