归并排序模板C++
根据清华大学出版社出版的算法设计与分析(第2版)王红梅 胡明 编著
- 时间复杂度:O(nlog2n)
- 首先对要排序的序列划分为两个子序列,直到子序列的长度划分1结束
- 其次将两个相邻的有序子序列合并,合并方法时间复杂度为 O(n)
- 归并排序(merge_sort)是按照记录在序列中的位置对序列进行划分
- 快速排序(quick_sort)是按照记录的值对序列进行划分
- 两者都是基于分治法,时间复杂度都相同
对代码的解析
#include <iostream>
using namespace std;
void Merge(int arr[],int temp[],int low,int mid,int high)
{
int i = low;
int j = mid+1;
int k = low;
while(i <= mid && j <= high)
{
if(arr[i] < arr[j]) temp[k++] = arr[i++];
else temp[k++] = arr[j++];
}
while(i <= mid) temp[k++] = arr[i++];
while(j <= high) temp[k++] = arr[j++];
}
void Merge_sort(int arr[],int low,int high)
{
int mid;
int temp[100];
if(low == high) return;
else{
mid = (low + high)/2;
Merge_sort(arr,low,mid);
Merge_sort(arr,mid+1,high);
Merge(arr,temp,low,mid,high);
for(int i = low; i <= high; i++)
arr[i] = temp[i];
}
}
int main(int argc, char** argv) {
int arr[8];
for(int i = 0; i < 8; i++)
{
cin >> arr[i];
}
Merge_sort(arr,0,7);
for(int i = 0;i < 8; i++)
{
cout << arr[i] << " ";
}
return 0;
}
精简版模板
void Merge(int arr[],int temp[],int low,int mid,int high)
{
int i,j,k;
i = k = low;j = mid+1;
while(i <= mid && j <= high)
{
if(arr[i] < arr[j]) temp[k++] = arr[i++];
else temp[k++] = arr[j++];
}
while(i <= mid) temp[k++] = arr[i++];
while(j <= high) temp[k++] = arr[j++];
}
void Merge_sort(int arr[],int low,int high)
{
int mid,temp[100];
if(low == high) return;
else{
mid = (low + high)/2;
Merge_sort(arr,low,mid);
Merge_sort(arr,mid+1,high);
Merge(arr,temp,low,mid,high);
for(int i = low; i <= high; i++)
arr[i] = temp[i];
}
}