归并排序的思想是将数组分成两部分,分别进行排序,然后归并起来。
1. 归并方法
归并方法将数组中两个已经排序的部分归并成一个。
void Merge(vector<int> &nums, vector<int> &aux, int start, int middle, int end)
{
int i = start;
int j = middle + 1;
for (int k = start; k <= end; ++k)
{
aux[k] = nums[k];
}
for (int k = start; k <= end; k++)
{
if (i > middle)
nums[k] = aux[j++];
else if (j > end)
nums[k] = aux[i++];
else if (aux[i] < aux[j])
nums[k] = aux[i++];
else
nums[k] = aux[j++];
}
}
2. 自顶向下归并排序:
void sortD(vector<int> &nums, vector<int> &aux, int start, int end)
{
if (start >= end)
return;
int middle = start + (end - start) / 2;
sortD(nums,aux, start, middle);
sortD(nums, aux, middle + 1, end);
Merge(nums, aux, start, middle, end);
}
完整代码:
// findJob.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
// 我想实现一下希尔排序
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;
void sortD(vector<int> &nums, vector<int> &aux, int start, int end);
void Merge(vector<int> &nums, vector<int> &aux, int start, int middle, int end);
int main()
{
vector<int> n = { 7, 4,2, 8, 1, 5, 0, -1, 12,45,111,123,1415 };
vector<int> aux(n.size());
sortD(n,aux, 0, n.size()-1);
for (int i = 0; i < n.size(); i++)
{
printf("%d ", n[i]);
}
}
void sortD(vector<int> &nums, vector<int> &aux, int start, int end)
{
if (start >= end)
return;
int middle = start + (end - start) / 2;
sortD(nums,aux, start, middle);
sortD(nums, aux, middle + 1, end);
Merge(nums, aux, start, middle, end);
}
void Merge(vector<int> &nums, vector<int> &aux, int start, int middle, int end)
{
int i = start;
int j = middle + 1;
for (int k = start; k <= end; ++k)
{
aux[k] = nums[k];
}
for (int k = start; k <= end; k++)
{
if (i > middle)
nums[k] = aux[j++];
else if (j > end)
nums[k] = aux[i++];
else if (aux[i] < aux[j])
nums[k] = aux[i++];
else
nums[k] = aux[j++];
}
}
运行结果: