【算法思想】归并排序是利用归并的思想实现的排序方法,该算法采用“分而治之”的思想将问题分成一些小的问题然后递归实现,最后合而为之。
【图解】
【代码实现】
----->递归实现
void Merge(int* arr, const int left, const int mid, const int right, int *temp)
{
int i = left;//检测指针
int j = mid;//检测指针
int k = left;//存放指针
while (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++];
}
//将已经排好序的辅助空间的值拷贝到原数组arr中
memcpy(arr + left, temp + left, (right - left)*sizeof(int));
}
void _MergeSort(int *arr,int left,int right,int *temp)
{
if (right - left <= 1)//剩余一个元素就不处理了
return;
if (left < right)
{
int mid = left + ((right - left) >> 1);//从中间划分为两个子区间
_MergeSort(arr, left, mid, temp);//对左侧子序列进行递归排序
_MergeSort(arr, mid, right, temp);//对右侧子序列进行递归排序
Merge(arr, left, mid, right, temp);//合并
}
}
void MergeSort(int *arr, int size)
{
assert(arr);
int *temp = new int[size];
_MergeSort(arr, 0, size, temp);
delete[] temp;
}
------->非递归实现
void Merge(int* arr, const int left, const int mid, const int right, int *temp)
{
int i = left;//检测指针
int j = mid;//检测指针
int k = left;//存放指针
while (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++];
}
//将已经排好序的辅助空间的值拷贝到原数组arr中
memcpy(arr + left, temp + left, (right - left)*sizeof(int));
}
void MergeSortNor(int *arr, int size)
{
int * temp = new int[size];
int gap = 1;
while (gap < size)
{
for (int i = 0; i < size; i += 2*gap)
{
int left = i;
int mid = i + gap;
int right = mid + gap;
if (mid>size)//如果越界
{
mid = size;
}
if (right > size)//如果越界
{
right = size;
}
Merge(arr, left, mid, right, temp);
}
gap *= 2;
}
delete[] temp;
}
----->测试代码
void Print(int* arr, int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = { 2, 0, 4, 6, 5, 7, 5, 8, 9};
Print(arr, sizeof(arr) / sizeof(arr[0]));
MergeSort(arr,sizeof(arr) / sizeof(arr[0]));
//MergeSortNor(arr, sizeof(arr) / sizeof(arr[0]));
Print(arr, sizeof(arr) / sizeof(arr[0]));
getchar();
return 0;
}
代码如存在问题,欢迎指导~~~~!