算法思想:
已知一个待排序的数组a,把a的前一半进行排序,再把a的后一半进行排序,把2个已完成排序的数组进行归并排序到一个临时数组b中,然后把b中的数据再拷回a中即可。
时间复杂度:logn*n
空间复杂度:n
代码:
#include <iostream>
using namespace std;
void Merge(int arr[],int left,int mid,int right, int arr_temp[]);
void MergeSort(int arr[], int left, int right, int arr_temp[]);
int main()
{
int arr[] = {15,6,11,7,5,99,22,3,2,67,45,12,23,1,43,55,0,8,17,58};//初始待排序数组
int arr_temp[100];//临时数组
int size = sizeof(arr) / sizeof(int);
int left = 0, right = size - 1;
MergeSort(arr, left, right, arr_temp);
for (int i = 0; i < size; i++)
cout << arr[i] << " ";
return 0;
}
void MergeSort(int arr[], int left, int right, int arr_temp[])//定义的入参按照使用顺序进行的
{
if (left < right)//当left比right小时,进行排序
{
int mid = (left + right) / 2;//mid,mid+1
MergeSort(arr, left, mid, arr_temp);//将两个部分进行归并排序
MergeSort(arr, mid + 1, right, arr_temp);
Merge(arr, left, mid, right, arr_temp);
}
}
void Merge(int arr[], int left, int mid, int right, int arr_temp[])
{
int i = left, j = mid+1, k = 0;
while (i <= mid && j <= right)//先把有序数据存入temp
{
if (arr[i] > arr[j])
arr_temp[k++] = arr[j++];
else
arr_temp[k++] = arr[i++];
}
while (i <= mid )//注意这里是<=
arr_temp[k++] = arr[i++];
while (j <= right)//注意这里是<=
arr_temp[k++] = arr[j++];
//最后再把temp中的数据存回arr数组
for (int n = 0; n < right- left + 1; n++)
arr[left + n] = arr_temp[n];
}
归并排序主要是要理解归并过程中的分治思想,一个数组分成2个有序的部分,对这2个有序的部分进行排序即可。然后层层递归,将初始数组进行排序。
在自己动手撸码的过程中,要注意mid,mid+1,<=等细节部分即可。