归并排序属于高级的排序方法,在介绍归并排序的思想之前,先讲述一种采用比较方式的排序方法。假设有两个已经排好序的数组arr1[ ],arr2[ ],且均是升序或者降序,那么可以进行以下操作:以升序为例,先创建一个尺寸大小为arr1[ ]与arr2[ ]尺寸之和的数组temp[ ],然后同时从两数组的第0个元素开始遍历,若arr1[i] < arr2[j],则可以把arr1[i]放入temp[k]中后,执行i++,k++,继续往后比较;若arr1[i] > arr2[j],则可以把arr2[j]放入temp[k]中后,执行j++,k++,继续往后比较;最终直到把两个数组中的所有元素放入数组temp[ ]中。
总结地说,这种比较方式的排序方法思想就是:因为两个数组都是有序的(假设为升序),故两个数组自身的后一个元素肯定不小于前一个元素,所以当两个数组分别从头开始遍历时,只要发现本数组的当前元素比另一个数组的当前元素小,那么该元素肯定为目前两数组中最小的元素。
归并排序就是用到的这种方法,接下来讲述一下归并排序的思想。
(1) 归并排序的思想
(2) 归并排序的实现
本次排序算法采用C++模版编程来实现,并采用了递归的方法。
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;
template<class T,size_t N>
void PrintArr(T (&arr)[N])
{
copy(arr,arr+N,ostream_iterator<T>(cout," "));
cout << endl;
}
template<class T,size_t N>
void MergeSort(T (&arr)[N],size_t start = 0,ssize_t end = (N-1))
{
size_t size = end + 1 -start;
if(size <= 1) {
return;
}
if(size == 2) {
if(arr[start] > arr[end]) {
swap(arr[start],arr[end]);
}
return;
}
ssize_t mid = size/2;
MergeSort(arr,start,start+mid-1);
MergeSort(arr,start+mid,end);
size_t i(start),j(start+mid),k(0);
T temp[size];
while(i < (start+mid) or j <= end) {
if(arr[i] <= arr[j] and i < (start+mid) or j == (end+1)) {
temp[k] = arr[i];
k++;
i++;
} else if(arr[j] <= arr[i] and j <=end or i == (start+mid)) {
temp[k]= arr[j];
k++;
j++;
}
}
i = start;
k = 0;
while(i <= end ) {
arr[i] = temp[k];
i++;
k++;
}
PrintArr(arr);
return;
}
int main()
{
int arr[]= {1,8,6,4,10,5,3,2,22};
// int arr[]= {1,4,5,2,4,8,9,10,22,4,6,1,8,9,1,21,34,54,2,4};
cout << "The init:" << endl;
PrintArr(arr);
cout << "The sort:" << endl;
MergeSort(arr);
PrintArr(arr);
cout << "The final:" << endl;
PrintArr(arr);
}
原始数组为:1 8 6 4 10 5 3 2 22
程序运行结果为:1 2 3 4 5 6 8 10 22