经典排序算法-归并排序
- 一些基础的算法需要亲手实践。
- 归并算法使用了分治的思想。在算法中很好的使用了递归的处理技巧。
// 用该题练习一下归并排序算法
void Merge(int *arr, int left, int mid, int right, int *tmp)
{
// [left, mid][mid + 1, right]两个区间段有序,需要合并
int i = left;
int j = mid + 1;
int cnt = 0;
while (i <= mid && j <= right) {
if (arr[i] < arr[j]) {
tmp[cnt++] = arr[i++];
} else {
tmp[cnt++] = arr[j++];
}
}
while (i <= mid) {
tmp[cnt++] = arr[i++];
}
while (j <= right) {
tmp[cnt++] = arr[j++];
}
// 将tmp中保存的有序序列,拷贝到arr中,使得arr在[left, right]区间上有序
int k = 0;
while (k < cnt) {
arr[left + k] = tmp[k];
k++;
}
}
void MySort(int *arr, int left, int right, int *tmp)
{
if (left < right) {
int mid = left + (right - left) / 2;
MySort(arr, left, mid, tmp);
MySort(arr, mid + 1, right, tmp);
// 经过上面的两个sort之后,[left, mid][mid + 1, right]两个区间段已经是有序的了。
// 接下来需要将两个区间重新按照有序的方式合并了。
Merge(arr, left, mid, right, tmp);
}
}
int Sort(int* nums, int numsSize)
{
int *tmp = (int *)malloc(sizeof(int) * numsSize);
memset(tmp, 0, sizeof(int) * numsSize);
// 将nums 使用归并排序方式给排序了
MySort(nums, 0, numsSize - 1, tmp);
return 0;
}