归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
归并操作的工作原理如下:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
代码如下:
/******************************************************************************** ** auth: Vincent Lau ** mail: [email protected] ** 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; }
运行结果:
时间: 2024-11-08 22:06:03