归并排序方法

#include <iostream>
using namespace std;

void mergearray(int a[], int first, int mid, int last, int temp[])
{
int i = first, j = mid + 1;
int m = mid, n = last;
int k = 0;

while (i <= m && j <= n)
{
if (a[i] <= a[j])
temp[k++] = a[i++];
else
temp[k++] = a[j++];
}

while (i <= m)
temp[k++] = a[i++];

while (j <= n)
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); //右边有序
mergearray(a, first, mid, last, temp); //再将二个有序数列合并
}
}

bool MergeSort(int a[], int n)
{
int *p = new int[n];
if (p == NULL)
return false;
mergesort(a, 0, n - 1, p);
delete[] p;
return true;
}

int main()
{
int a[10] = { 3, 2, 1, 4, 5, 7, 6, 9, 8, 10 };
MergeSort(a, 10);
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
}

时间: 2024-10-05 16:12:28

归并排序方法的相关文章

算法学习 - 链表之归并排序_O(1)空间_O(NlogN)时间_C++

归并排序 归并排序我在之前已经讲过了,并且给了在数组的数列的情况下的归并排序方法,而排序的时间复杂度为O(NlogN).想看的话链接如下: 归并排序,快排,冒泡排序 但是这个归并排序有一个缺点:需要O(n)的额外空间. 那么这个缺点在什么情况下会解决呢?就是数列是以链表形式存储的时候!就不需要额外的申请O(n)级别的空间. 那么我们为什么要用归并排序呢? 不是还有快排,堆排么?都是速度很快的排序.其实在链表中是不适合的!因为在快排的时候,查找标杆是O(1)级别的,但是在链表中只能得到head节点

都2020年了,听说你还不会归并排序?手把手教你手写归并排序算法

本文介绍了归并排序的基本思想,递归方法的一般写法,最后一步步手写归并排序,并对其性能进行了分析. 基本思想 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用.即先使每个子序列有序,再将已有序的子序列合并,得到完全有序的序列.这里给出一种递归形式的归并排序实现. 递归方法的一般写法 递归方法的书写主要有三步: 明确递归方法的功能边界: 得到递归的递推关系: 给定递归的终止条件. 递归方法均可按照这三步进行,切忌不要陷入递归实现的细节中.下面以归并排序算法的书写

《C算法.第1卷,基础、数据结构、排序和搜索(第三版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <C算法>介绍了当今最重要的算法,共分3卷,<C算法(第1卷):基础.数据结构.排序和摸索>是第1卷.第1卷分4部分.共16章.第一部分"基础知识"(第1-2章)介绍了基本算法分析原理.第二部分"数据结构"(第3-5章)讲解算法分析中必须掌握的数据结构知识.主要包括基本数据结构.抽象数据结构.递归和树.第三部分"排序"(第6-11章)按章节顺序分别讨论了基本排序方法(

图文并茂排序与算法

图文并茂排序与算法总结 转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5094764.html 总结下常用的排序算法,方便以后查阅. 常见排序算法:冒泡排序.选择排序.插入排序.壳(shell)排序.合并排序.快速排序.堆排序. 要选择合适的算法,需考虑的因素:执行时间.存储空间和编程工作. 1.选择排序 具有二次方程增长阶,近适用于小列表排序. 通过列表反复扫描,每次扫描选择一项,然后将这一项移动到列表中正确的位置. 选择排序总比较次数=(n-1)+(

算法笔记_065:分治法求逆序对(Java)

目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序)   1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度百科: 设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同. 如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数. 例如,数组(3,1,4,5,

几种常见的排序算法总结

*****选择排序***** 方法描述:首先找到第一个最小的数,和第一个数交换:然后从剩下的找出最小的与第二个交换,以此类推.效率: 长度为N的数组,大约N2/2比较,N次交换特点: 1.运行时间和输入无关,有序数组,全部相等的数组,随机数组所用时间一样,没有充分利用输入的初始状态. 2.数据移动最少,与输入成线性关系.代码: sort(int[] a){ int n = a.length; for(int i = 0; i < n; i++){ int min = i; for(int j =

图文并茂排序与算法总结

总结下常用的排序算法,方便以后查阅. 常见排序算法:冒泡排序.选择排序.插入排序.壳(shell)排序.合并排序.快速排序.堆排序. 要选择合适的算法,需考虑的因素:执行时间.存储空间和编程工作. 1.选择排序 具有二次方程增长阶,近适用于小列表排序. 通过列表反复扫描,每次扫描选择一项,然后将这一项移动到列表中正确的位置. 选择排序总比较次数=(n-1)+(n-2)+(n-3)+...+3+2+1 =n(n-1)/2 n(n-1)/2是O(n^2)阶的级,所以选择排序是阶O(n^2)的算法.

排序sort (一)

这两天学习排序,简单的记录下,等看完之后再进行总结. 1.首先看了交换排序,顾名思义,也就是当无序时进行元素交换,从而达到元素有序. [1]初级的是冒泡排序,冒泡排序的思想是:两两相邻的数据元素进行比较,如果反序则交换,直到有序为止,同时每一次比较之后较小(大)的数上浮,较大(小)的数下沉,因此命名为冒泡排序.因为是两两相邻的数进行比较,且相等时不进行交换,所以是一种稳定的排序算法. 冒泡排序(Bubble Sort)代码实现为: void bubblesort(vector<int>&

剑指offer第36题 求逆序数

#include<iostream> using namespace std; int Merge(int *list,int*copy,int s1,int s2,int end) { int i=s1; int j=s2; int k=s1; int num=0; for(int k=s1;k<=end;k++) copy[k]=list[k]; while(i<=s2-1&&j<=end) { if(copy[i]>copy[j]) { num=n