MergeSort(归并排序)
归并排序就是通过不断的归并来实现的,将数组用一个固定的长度实现各个部分的归并后,实现了各个部分的有序,再将长度改变,实现各个部分之间的有序,就这样一步步实现整个数组的有序。
#include<iostream>
using namespace std;
void MergeSortbefore(int arr[], int start, int mid, int end)//将两个部分有序的部分合并
{
int head1, head2;
head1 = start;head2 = mid + 1;
int* newarr;
newarr = new int[end - start + 2];
int count=0;
while (head1 <= mid && head2 <= end)
{
if (arr[head1]<arr[head2])
{
newarr[count] = arr[head1];
head1++;
count++;
}
else
{
newarr[count] = arr[head2];
head2++;
count++;
}
}
if (head1 > mid)
{
while (head2 <= end)
{
newarr[count] = arr[head2];
count++;
head2++;
}
}
else
{
while (head1 <= mid)
{
newarr[count] = arr[head1];
count++;
head1++;
}
}
/******将数组进行复制*****/
int j = 0;
for (int i = start;i <= end;i++)
{
arr[i] = newarr[j];
j++;
}
delete[] newarr;//释放内存
}
void MergeSort(int arr[],int length)//正式合并
{
int count = 1;//合并的长度,通过长度的不断变化,来实现合并
int i;
while (count < length)
{
for ( i = 0;i + 2 * count -1 <= length-1;i = i + 2 * count)
{
MergeSortbefore(arr, i, i + count - 1, i + 2 * count - 1);
}
if ((i + count - 1) < length - 1)//不足够合并的数据
{
MergeSortbefore(arr, i, i + count - 1, length - 1);
}
count = 2 * count;//长度的变化
}
}
int main()
{
int arr[] = { 1,3,3,5,6,0,54,34,357 };
int length = (int)sizeof(arr) / sizeof(*arr);
MergeSort(arr, length);
for (size_t i = 0; i < length; i++)
{
cout << arr[i] << " ";
}
return 0;
}