归并排序:
1、算法描述:
将待排序的元素序列分为两个长度相等的子序列,对每个子序列进行排序,然后将他们合并成一个序列,合并两个子序列的过程称为二路归并.
2、动态图演示:
3、代码实现(C++):
//归并排序
#include<iostream>
#include<assert.h>
using namespace std;
//归并
void MergeData(int *arr, int left, int mid, int right, int *temp){
int temp_index = left;
int left_L = left;
int left_R = mid;
int right_L = mid;
int right_R = right;
while (left_L<left_R && right_L<right_R)
{
if (arr[left_L]<arr[right_L])
{
temp[temp_index++] = arr[left_L++];
}
else
{
temp[temp_index++] = arr[right_L++];
}
}
while (left_L<left_R)
{
temp[temp_index++] = arr[left_L++];
}
while (right_L<right_R)
{
temp[temp_index++] = arr[right_L++];
}
}
//分组
//void *memcpy(void*dest, const void *src, size_t n);
//由src指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内。
void _MergeSort(int *arr, int left, int right, int *temp){
if ((right - left)>1)
{
int mid = left + ((right - left) >> 1);
_MergeSort(arr, left, mid, temp);
_MergeSort(arr, mid, right, temp);
MergeData(arr, left, mid, right, temp);
memcpy(arr + left, temp + left, sizeof(int)*(right - left));
}
}
//递归
void MergeSort(int *arr, int size){
int *temp = (int *)malloc(size*sizeof(arr[0]));
if (temp == NULL)
{
assert(0);
return;
}
_MergeSort(arr, 0, size, temp);
free(temp);
}
//非递归
void MergeSort_Nor(int *arr, int size){
int *temp = (int *)malloc(size*sizeof(arr[0]));
if (temp == NULL)
{
assert(0);
return;
}
int i = 0;
int gap = 1;
while (gap<size)
{
for (i = 0; i < size; i += 2 * gap){
int left = i;
int mid = left + gap;
int right = mid + gap;
if (mid>size)
{
mid = size;
}
if (right>size)
{
right = size;
}
MergeData(arr, left, mid, right, temp);
}
memcpy(arr, temp, size*sizeof(arr[0]));
gap = gap * 2;
}
free(temp);
}
int main(){
int array[] = { 2, 0, -4, 9234, 0, 2, 8, 1, 1, -5 };
int size = sizeof(array) / sizeof(array[0]);
MergeSort(array, size); //递归
//MergeSort_Nor(array, size); //非递归
for (auto e : array)
{
cout << e << " ";
}
cout << endl;
return 0;
}