Algorithm Road~合并排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于Algorithm Road~合并排序的主要内容,如果未能解决你的问题,请参考以下文章

Algorithm Master Road:算法的时间/空间复杂度

LeetCode Algorithm 21. 合并两个有序链表

LeetCode Algorithm 21. 合并两个有序链表

将两个排序向量合并到一个排序向量中

BZOJ 2750 Road

面试题25:合并两个排序的链表