排序算法之归并排序
原理:
归:用分治法的思想把一个无序的数组进行拆分,直到每个组中只有一个数时,可以认为这个单独的数是有序的.
并:把每个有序的组通过排序进行合并
图解:
算法实现:
#include <iostream>
using namespace std;
void merge(int* arr, int left, int right,int arrLen);//实现对有序数组的合并
void mergeSort(int* arr, int left, int right,int arrLen);//实现归并排序算法
int main()
{
int arr[] = { 8,3,11,2,5,1,9 };
int arrLen = sizeof(arr) / sizeof(arr[0]);
mergeSort(arr, 0, arrLen-1, arrLen);
for (int i = 0; i < arrLen; i++)
{
cout << arr[i] << " ";
}
return 0;
}
void merge(int* arr, int left, int right, int arrLen)
{
int mid = (left + right) / 2;
int i = left; //用来标记左侧的最小元素位置
int j = mid + 1; //用来标记右侧的最小元素位置
int k = left;
int* temp = new int[arrLen];
while (i < j&&(i<=mid&&j<=right))
{
if (arr[i] <= arr[j])
{
temp[k++] = arr[i++];
}
else
{
temp[k++] = arr[j++];
}
}
while (i <= mid)
{
temp[k++] = arr[i++];
}
while (j <= right)
{
temp[k++] = arr[j++];
}
memcpy(arr + left, temp + left,sizeof(int)* (right - left + 1));
}
void mergeSort(int* arr, int left, int right, int arrLen)
{
int mid = (left + right) / 2;
if (left < right)
{
mergeSort(arr, left, mid, arrLen);
mergeSort(arr, mid + 1, right, arrLen);
merge(arr, left, right, arrLen);
}
}
运行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ebNXH9zL-1607436766418)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201208215920055.png)]
总结
时间复杂度O(nlogn)
运行结果
总结
时间复杂度O(nlogn)