归并排序
算法笔记
算法笔记及自我总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、归并排序
C++版
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
void Merge(int* arr, int start, int mid, int end)
{
//计算出临时数组temp的需要长度大小
int n = end - start + 1;
//定义临时数组temp
int* temp = new int[n];
int i = 0;
//设置两个新的下标left和right(等于中间数后一位,第二个序列的起始位)
int left = start;
int right = mid + 1;
/*
while(left <= mid && right <= end)
{
if (arr[left] <= arr[right])
{
temp[i++] = arr[left++];
}
else
{
temp[i++] = arr[right++];
}
}
与
while (left <= mid && right <= end)
{
temp[i++] = arr[left] <= arr[right] ? arr[left++] : arr[right++];
}
同理即取数组arr[left]和arr[right]中较小者放入临时数组temp[i]
*/
while (left <= mid && right <= end)
{
temp[i++] = arr[left] <= arr[right] ? arr[left++] : arr[right++];
}
while (left <= mid)
{
temp[i++] = arr[left++];
}
while (right <= end)
{
temp[i++] = arr[right++];
}
for (int j = 0; j < n; j++)
{
arr[start + j] = temp[j];
}
delete[]temp;
}
void MergeSort(int* arr, int start, int end)
{
//只有一个元素,直接赋值
if (start == end)
return;
//将数组分成两半,取中间数mid
int mid = (start + end) / 2;
//归并排序前半个子序列
MergeSort(arr, start, mid);
//归并排序后半个子序列
MergeSort(arr, mid + 1, end);
//合并两个已排序的子序列
Merge(arr, start, mid, end);
}
int main()
{
int a[10] = { 6,1,0,3,5,8,9,7,4,2 };
MergeSort(a, 0, 9);
cout << "排序后:" << endl;
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
system("pause");
return 0;
}
Python版
def Merge(left, right):
# 合并操作,将两个有序数组left[]和right[]合并成一个大的有序数组
# 设置left与right的下标指针l与j,和临时数组result[]
l, r = 0, 0
result = []
# 找出left[],right[]中较小的一个数放入临时数组
while l < len(left) and r < len(right):
if left[l] < right[r]:
result.append(left[l])
l += 1
else:
result.append(right[r])
r += 1
# 添加数组中剩余的元素,两个数组下标总会有一个先走完
result += left[l:]
result += right[r:]
return result
def MergeSort(alist):
if len(alist) <= 1:
return alist
# 二分法,分解数组
num = len(alist) // 2
# 递归调用二分法,分解到单个值再进行左右排序
left = MergeSort(alist[:num])
right = MergeSort(alist[num:])
# 合并两个数组
return Merge(left, right)
if __name__=='__main__':
alist = [6,1,0,3,5,8,9,7,4,2]
alist1 = MergeSort(alist)
print(alist1)
总结
归并排序的代码实现总体是运用了分治法和递归。我认为最容易忽略的问题是归并排序中Merge函数实现的其实就是把已经排序好的两个数组,进行最后的合并排序处理;MergeSort函数则是运用递归直接让计算机用二分法解决两个序列排序。