博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
归并排序的进一步理解
阅读量:5293 次
发布时间:2019-06-14

本文共 2023 字,大约阅读时间需要 6 分钟。

归并排序,顾名思义-先递归再合并的排序方式,一层一层的递归,当递归到最底层的时候,进行合并操作,这也是分治算法的经典运用。

首先是要进行把两个有序的序列进行合并操作,需要借助辅助空间,先把有序序列存储在辅助空间中,在从辅助空间把有序序列复制到原序列中,完成合并操作,相应代码如下:

void Merge(int a[] , int first , int mid , int last , int temp[])   {    int i = first , j = mid + 1 , k = 0 ;    while(i <= mid && j <= last)        if(a[i] < a[j])            temp[k++] = a[i++] ;        else            temp[k++] = a[j++] ;        while(i <= mid)            temp[k++] = a[i++] ;        while(j <= last)            temp[k++] = a[j++] ;        for(i = 0 ; i < k ; i++)            a[first+i] = temp[i] ;}

然后就是递归函数的操作,先把原来序列分成两组无序序列,再分别把这两组无序序列分别分为两个无序序列,直到不能再分为止,默认单个元素为有序序列,然后进行合并排序,相应代码如下:

void Mergesort(int a[] , int first , int last , int temp[]) {    if(first < last)    {        int mid = (first + last) / 2 ;        Mergesort(a,first,mid,temp) ;        Mergesort(a,mid+1,last,temp) ;        Merge(a,first,mid,last,temp) ;    }}

 

全部归并排序算法代码实现如下:

#include
void Merge(int a[] , int first , int mid , int last , int temp[]) { int i = first , j = mid + 1 , k = 0 ; while(i <= mid && j <= last) if(a[i] < a[j]) temp[k++] = a[i++] ; else temp[k++] = a[j++] ; while(i <= mid) temp[k++] = a[i++] ; while(j <= last) temp[k++] = a[j++] ; for(i = 0 ; i < k ; i++) a[first+i] = temp[i] ;}void Mergesort(int a[] , int first , int last , int temp[]) { if(first < last) { int mid = (first + last) / 2 ; Mergesort(a,first,mid,temp) ; Mergesort(a,mid+1,last,temp) ; Merge(a,first,mid,last,temp) ; }}int main() { int n ; scanf("%d",&n) ; int a[100] , i; for(i = 0 ; i < n ; i++) scanf("%d",&a[i]) ; int *temp = new int[n] ; Mergesort(a,0,n-1,temp) ; delete[] temp ; for(i = 0 ; i < n ; i++) printf("%d ",a[i]) ; printf("\n") ; return 0 ;}

归并排序算法的效率还是比较高的,设数列长度为n,则将数列分为小数列一共需要logN步,每步都是合并有序数列的过程,所以归并排序的时间复杂度为:O(N*logN),空间复杂度为O(n);

转载于:https://www.cnblogs.com/NYNU-ACM/p/4237403.html

你可能感兴趣的文章
通过httplib2 探索的学习的最佳方式
查看>>
理解运算符重载 4
查看>>
快来熟练使用 Mac 编程
查看>>
第二周
查看>>
断言简介
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
plsql使用,为什么可以能看见其他用户的表
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
Scripting Java #3:Groovy与invokedynamic
查看>>
2014-04-21-阿里巴巴暑期实习-后台研发-二面经验
查看>>
数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列
查看>>
使用pager进行分页
查看>>
吐医疗器械研发可配置性需求的槽点
查看>>
UVA - 1592 Database
查看>>
机器翻译评价指标 — BLEU算法
查看>>
机器学习基石(9)--Linear Regression
查看>>
Min Stack
查看>>
从LazyPhp说起
查看>>
Fine Uploader文件上传组件
查看>>
Spring Boot与Spring的区别
查看>>