归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:
- 自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);
- 自下而上的迭代;
2. 算法步骤
-
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
-
设定两个指针,最初位置分别为两个已经排序序列的起始位置;
-
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
-
重复步骤 3 直到某一指针达到序列尾;
-
将另一序列剩下的所有元素直接复制到合并序列尾。
3. 动图演示
c++代码实现(递归版)(多看几遍文章、视频就能理解了
#include<iostream>
using namespace std;
//合并函数,将两个有序子数组进行有序合并
void merge(int source_arr[], int temp_arr[], int start_index, int mid_index, int end_index)
{
int i = start_index, j = mid_index + 1, k = start_index;
//将有序数组放在临时数组
while (i <= mid_index && j <= end_index)
{
if (source_arr[i] < source_arr[j])
temp_arr[k++] = source_arr[i++];
else
temp_arr[k++] = source_arr[j++];
}
while (i <= mid_index)
temp_arr[k++] = source_arr[i++];
while (j <= end_index)
temp_arr[k++] = source_arr[j++];
//把临时数组放回原数组
for (i = start_index; i <= end_index; i++)
source_arr[i] = temp_arr[i];
}
void merge_sort(int source_arr[], int temp_arr[], int start_index, int end_index)
{
//将数组分--“分”
if (start_index >= end_index) return;
int mid_index = (start_index + end_index) / 2;
merge_sort(source_arr, temp_arr, start_index, mid_index);
merge_sort(source_arr, temp_arr, mid_index+1, end_index);
//合并 --“治”
merge(source_arr, temp_arr, start_index, mid_index, end_index);
}
int main(){
int arr[] = { 0,1,9,5,7,2,4,3,8,6,11,10 };
int b[12] = { 0 };
int start_index = 0, end_index = sizeof(arr) / sizeof(int) - 1;
for (auto it : arr)
cout << it << " ";
cout << "\n";
merge_sort(arr, b, start_index, end_index);
for (auto it : arr)
cout << it << " ";
cout << "\n";
system("pause");
return 0;
}