归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
归并操作的工作原理如下:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
代码如下:
- /********************************************************************************
- ** auth: Vincent Lau
- ** mail: 985632368@qq.com
- ** date: 2015.6.22
- ** desc:
- ** Ver : V1.0.0
- *********************************************************************************/
- #include<iostream>
- #define SIZE 21
- #include<list>
- typedef int Sqlist[SIZE];
- using namespace std;
- //====================================Merge()===================================
- /// @brief <对函数进行概括说明> 合并
- ///
- /// <对函数进行详细说明>
- ///
- /// @remark <函数特别说明> 将数组中连续的两个子序列合并为一个有序序列
- //================================================================================
- void Merge(Sqlist &L, int left, int mid, int right)
- {
- Sqlist L1; //开辟等大空间
- for (int i = 0; i < SIZE; ++i)
- {
- L1[i] = L[i];
- }
- int s1 = left;
- int s2 = mid+1;
- int k = left;
- while (s1 <= mid && s2 <= right) //左右有序两部分合并
- {
- if (L1[s1] < L1[s2])
- L[k++] = L1[s1++];
- else
- L[k++] = L1[s2++];
- }
- while (s1 <= mid) //长度不同的情况
- {
- L[k++] = L1[s1++];
- }
- while (s2 <= right)
- {
- L[k++] = L1[s2++];
- }
- }
- //==================================MergeSort()=================================
- /// @brief <对函数进行概括说明> MergeSort
- ///
- /// @remark <函数特别说明> 自底向上的归并排序
- ///
- /// @sa <可以参考的类或函数,用空格分隔,函数名称后必须加()> Merge()
- //================================================================================
- void MergeSort(Sqlist &L, int left, int right)
- {
- if (left >= right)
- return;
- int mid = (left + right) / 2;
- MergeSort(L,left,mid); //递归左部分排序
- MergeSort(L, mid+1, right); //递归右部分排序
- Merge(L,left, mid, right); //合并
- }
- void main(void)
- {
- Sqlist L = { 49, 38, 65, 97, 76, 13, 27, 49 };
- cout << "原数组为:" << endl;
- for (int i = 0; i < 8; ++i)
- {
- cout << L[i] << " ";
- }
- cout << endl;
- MergeSort(L, 0, 7);
- cout << "归并排序:" << endl;
- for (int i = 0; i < 8; ++i)
- {
- cout << L[i] << " ";
- }
- cout << endl;
- }
运行结果: