C++归并排序
归并排序的本质是进行分治排序,然后再进行合并,从而实现总体数组的有序排列,时间复杂度为O(N*logN)。
将数组不断二分排序,然后每组之间进行元素大小的对比,从而形成新的有序数组,即先进行递归,再排序。左侧有序,右侧有序,然后排序让整个数组有序。
#include<iostream>
using namespace std;
class Solution
{
public:
Solution()
{
int a[10] = { 1,4,2,5,3,8,10,9,7,6 };
Mergesort(a, 0, 9);
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
}
void Mergesort(int arr[], int l, int r)
{
if (l == r)
{
return;
}
int mid = l + (r - l) / 2;
Mergesort(arr, l, mid); //左侧排好序
Mergesort(arr, mid + 1, r); //右侧排好序
Merge(arr, l, mid, r); //排序
}
void Merge(int arr[], int l, int mid, int r)
{
int *help = new int[r - l + 1]; //开辟一个新的数组空间O(N)
int i = 0;
int p1 = l; //左侧的指针
int p2 = mid + 1; //右侧的指针
while (p1 <= mid && p2 <= r) //数组的左侧和右侧的元素不断进行对比,较小的元素赋值进数组
{
help[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
}
while (p2 <= r) //将两侧剩余的较大的元素全部赋值进去
{
help[i++] = arr[p2++];
}
while (p1<=mid) //和上一个while循环一样,这两个while循环只能发生一个
{
help[i++] = arr[p1++];
}
for (int i = 0; i < r-l+1; i++) //将help数组赋值给arr数组
{
arr[l + i] = help[i];
}
delete []help; //c++需要手动删除,进行内存管理
}
};
int main()
{
Solution solution;
system("pause");
return 0;
}