归并排序
原理:将数组中的数通过递归分开,再两两组合(并),在并起来的时候通过merge函数进行排序。
学习文章:https://blog.csdn.net/Moralin_/article/details/80491901
merge函数:将数组分成两个部分([low,mid] [mid+1,hight]),其次根据两部分
的最左边的数字大小排序,例如数组a:1,3,5,2 分成两部分为13|20,排列过程:
1>2>0>3
void merge(int low, int mid, int heigh) {
//int a[100]; int b[100];全局变量
int i = low, j = mid + 1; //分成两个区间low-mid,mid+1-heigh
int count = low; //count来计数
while (i != mid+1 && j != heigh+1) {
if (a[i] < a[j]) {
b[count++] = a[i++];
}
// b.push_back(a[j++])
else b[count++] = a[j++];
}
//若左边的序列没排
while (i != mid+1) {
b[count++] = a[i++];
}
//右边的序列没排完
while (j != heigh + 1) {
b[count++] = a[j++];
}
//将b数组已排好的数列复制给原本的a数组
for (int n = 0; n < count; n++)
{
a[n] = b[n];
}
}
并:把数字通过递归分成一小部分,再并起来。
void sort(int low,int heigh) {
int mid = (heigh + low) / 2;
if (low >= heigh) return;
else {
sort(low, mid);//向左分块
sort(mid+1, heigh);//向右分块
merge(low, mid, heigh);//利用merge规则合并
}
}
全部代码:
#include<iostream>
#include<deque>
#include<vector>
#include<memory>
using namespace std;
int a[100] = { 1,3,4,2,0 };
int b[100];
void merge(int low, int mid, int heigh) {
int i = low, j = mid + 1; //分成两个区间low-mid,mid+1-heigh
int count = low; //count来计数
while (i != mid+1 && j != heigh+1) {
if (a[i] < a[j]) {
b[count++] = a[i++];
}
else b[count++] = a[j++];
}
//若左边的序列没排
while (i != mid+1) {
/*b.push_back(a[i++]);*/
b[count++] = a[i++];
}
//右边的序列没排完
while (j != heigh + 1) {
b[count++] = a[j++];
}
for (int n = 0; n < count; n++)
{
a[n] = b[n];
}
}
void sort(int low,int heigh) {
int mid = (heigh + low) / 2;
if (low >= heigh) return;
else {
sort(low, mid);
sort(mid+1, heigh);
merge(low, mid, heigh);
}
}
int main()
{
sort(0, 4);
for (int i = 0; i < 5; i++)
{
cout << a[i] << endl;
}
system("pause");
return 0;
}
输出结果:01234