Algorithm Road~合并排序

 1 #include <iostream>
 2 using namespace std;
 3 /**
 4 分治法:
 5 合并排序最大的优点是它的时间复杂度为O(nlgn),这个是我们之前的选择排序和插入排序所达不到的。
 6 他还是一种稳定性排序,也就是相等的元素在序列中的相对位置在排序前后不会发生变化。
 7 他的唯一缺点是,需要利用额外的N的空间来进行排序。
 8
 9 实验步骤::
10 申请空间,使其大小为两个已经排序序列之和,然后将待排序数组复制到该数组中。
11 设定两个指针,最初位置分别为两个已经排序序列的起始位置
12 比较复制数组中两个指针所指向的元素,选择相对小的元素放入到原始待排序数组中,并移动指针到下一位置
13 重复步骤3直到某一指针达到序列尾
14 将另一序列剩下的所有元素直接复制到原始数组末尾
15
16 */
17 ///实现合并排序效果
18 template < class T>
19 void merge(T * arr, int low ,int mid, int heigh)
20 {
21 T * left =NULL,* right = NULL; ///两个指针用于指向两个分开数组
22 int i, j, k, len1 , len2;
23 len1 = mid - low +1; ///左侧数组长度
24 len2 = heigh - mid; ///右侧数组长度
25
26 ///动态分配内存
27 left = new T[len1];
28 right = new T[len2];
29
30 ///拆分数组
31 for( i = 0; i < len1; ++i)
32 left[i] = arr[low+i];
33 for( j = 0 ; j < len2 ;++j)
34 right[j] = arr[mid+j+1];
35
36 ///排序后合并
37 i = j = 0;
38 k = low;
39 while( i < len1 && j < len2)
40 {
41 if(left[i] <= right[j])
42 arr[k++] = left[i++];
43 else
44 arr[k++] = right[j++];
45 }
46 ///处理剩余的未合并完的数据
47 for( ; i < len1 ;++i) ///如果左数组有元素剩余,则将剩余元素合并到arr数组
48 arr[k++] = left[i];
49 for( ; j < len2;++j) ///如果右数组有元素剩余,则将剩余元素合并到arr数组
50 arr[k++] = right[j];
51 }
52
53 template <typename T>
54 void mergeSort(T * arr , int low, int heigh)
55 {
56 int mid;
57 if(low < heigh) ///判定是否需要排序,只有一个或无记录时不须排序
58 {
59 mid = (int)(low + heigh)/2 ; ///将arr数组分为两半
60 mergeSort(arr, low, mid);
61 mergeSort(arr, mid+1, heigh);
62 merge(arr, low , mid , heigh);
63 }
64 }
65
66 int main()
67 {
68 int n;
69 int* input = NULL;
70 cout<<"请输入数组的长度: ";
71 cin>>n;
72 input = new int[n];
73 cout<<"请对数组赋值: ";
74 for(int i=0; i<n; ++i)
75 {
76 cin>>input[i];
77 }
78 //处理数据
79 mergeSort(input,0,n-1);
80 //输出结果
81 for(int i=0; i<n; ++i)
82 cout<<input[i]<<" ";
83 cout<<endl;
84 system("pause");
85 return 0;
86 }
时间: 2024-07-28 17:20:07

Algorithm Road~合并排序的相关文章

ACM ICPC 2011–2012, NEERC, Northern Subregional Contest J. John’s Inversions(合并排序求逆序数对数)

题目链接:http://codeforces.com/gym/100609/attachments 题目大意:有n张牌,每张牌有红色和蓝色两面,两面分别写了一些数字,同种颜色的任意两个数字若排在前面的数字比排在后面的数字大就叫做一对逆序数.求怎样排序得到的逆序数对最少. 解题思路:其中一种颜色的数字是顺序且这种颜色数字相同时对应的另一种颜色的数字是顺序时得到的逆序数对数最少.难点在于求逆序数对数.因为数量很大O(n^2)复杂度不能满足,这里根据合并排序的原理求解每个数字前面有多少个比它大的数字,

归并排序(合并排序)(逆序对)

Description 在这个问题中,你需要分析一个对n个不同数排序的算法.该算法主要通过交换相邻数直到序列有序(升序).比如:对输入序列 9 1 0 5 4 经过一系列交换后变成有序序列 0 1 4 5 9你的任务是计算将序列变成有序最少需要经过多少次交换. Input 输入包含多组测试数据.每组第一个是整数n<500,000,表示输入序列的长度,接下来是n行,每行有一个整数a[i](0≤a[i]≤999,999,999).当n=0时表示结束. Output 对每一组输入,输出该序列变成有序所

3种sort:insertion_sort,merge_sort,quick_sort 插入排序 合并排序 快速排序

插入排序,普通排序 一般 前端够用,样本容量小于1000,根本看不出性能问题 function insertion_sort(arr){ var len=arr.length; for(var j=1;j<len;j++){ var key=arr[j]; var i=j-1; while(i>=0&&arr[i]>key){ arr[i+1]=arr[i]; i=i-1; } arr[i+1]=key; } } 合并排序 merge_sort function _mer

合并排序算法时间复杂度分析

一.合并已排序的两个数组,依次比较两个数组元素大小,并按大小加入到暂存数组B,最后保存到A: Algorithm: MERGE(A, p, q, r) 输入:数组A[p...q]和A[q+1...r],各自按升序排列 输出:将A[p...q]和A[q+1...r]合并后的升序排序的新数组 01. s←p; t←q+1; k←p; {s, t, p 分别指向A[p...q], A[q+1...r]和暂存数组B} 02. while s≤q and t≤r 03. if A[s] ≤A[t] the

算法导论学习之插入排序+合并排序

最近准备花时间把算法导论详细的看一遍,强化一下算法和数据结构的基础,将一些总结性的东西写到博客上去. 一.插入排序 算法思想:如果一个数组A,从A[1–n-1]都是有序的,然后我们将A[n]插入到A[1–n-1]的某个合适的位置上去那么就可以保证A[1–n]都是有序的.这就是插入排序的思想:具体实现的时候我们将数组的第一个元素看出有序,然后从第二个元素开始按照上面的步骤进行插入操作,直到插入最后一个元素,然后整个数组都是有序的了. 时间复杂度分析:代码中有两重for循环,很容易看出时间复杂度是n

C言语合并排序(兼并排序)算法及代码

合并排序也称兼并排序,其算法思惟是将待排序序列分为两局部,顺次对分得的两个局部再次运用合并排序,之后再对其停止兼并.仅从算法思惟上理解合并排序会认为很笼统,接下来就以对序列A[0], A[l]-, A[n-1]停止升序陈列来停止解说,在此采取自顶向下的完成办法,操作步调如下.(1)将所要停止的排序序列分为阁下两个局部,假如要停止排序的序列的肇端元素下标为first,最初一个元素的下标为last,那么阁下两局部之间的临界点下标mid=(first+last)/2,这两局部辨别是A[first -

算法实验:分治法合并排序(C++)

这篇文章分两部分来写,第一部分写代码的实现过程,第二部分把实验报告从头到尾呈现出来. 我习惯调试使用的编译器是DEV C++,不是vs系列的,可能头文件上有点区别.但是下面的报告是我放到vs里面测试过的,可以直接用,不影响. 第一部分:(解析) 题目:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组. 题目分析: 需要随机产生一个整数数组: 采用的算法是合并排序,也就是用归并排序: 输出排序后的数组. 随机产生一个整数数组:这个问题首先想到的是用rand()函

改进版的合并排序

下面是改进版的合并排序,下面是jdk1.7的源码部分 执行步骤如下: (1)如果比较的长度小于INSERTIONSORT_THRESHOLD插入排序的阈值,直接调用传统的插入排序进行比较 (2)当大于插入排序的阈值时,采用合并排序算法,这里有个改进的地方,红色加亮部分,如果已经排好序的,不再进行比较,而是直接复制过去,提高效率 private static void mergeSort(Object[] src,                                  Object[]

合并排序

描述 给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中两路合并排序算法进行排序,并输出排序最后结果的相应序列. 输入 共两行,第一行给出排序元素数目n,第二行给出n个元素,1≤n≤100000,每个元素值范围为 [0,100000] 输出 一行,输出排序结果. 样例输入 748 36 68 72 12 48 2 样例输出 2 12 36 48 48 68 72 #include<stdio.h> #include<malloc.h> #define MaxSize