归并排序
归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
为了不重复造轮子。
归并原理参考:
https://blog.csdn.net/csdn_blog_lcl/article/details/78027038
递归原理参考:
https://blog.csdn.net/weixin_42199022/article/details/99304964
以下是我的代码
vs编译通过
head.h
#ifndef HEAD_H
#define HEAD_H
#include<iostream>
#include<time.h>
#include <iomanip>
using namespace std;
void merge(int* a, int first, int mid, int last, int* a1);
void merge_sort(int* a, int first, int last, int* a1);
void Array_generate(int *a, int len);
operation.cpp`
#include"head.h"
void Array_generate(int *a, int len)
{
srand(time(NULL));
for (int i = 0;i < len;i++)
{
a[i] = rand() % 100;
}
for (int j = 0;j < len;j++)
{
cout << setw(3) << a[j];
}
cout << endl;
}
void merge(int* a, int first, int mid, int last, int* a1)
{
int i, j, k;
i = first;
j = mid + 1;
k = 0;
while (i <= mid && j <= last) //确保归并完毕
{
if (a[i] <= a[j])
a1[k++] = a[i++];
else
a1[k++] = a[j++];
}
while (i <= mid)
a1[k++] = a[i++];
while (j <= last)
a1[k++] = a[j++];
for (i = 0; i < k; i++)
a[first + i] = a1[i]; //从a[first+i]开始赋值
}
void merge_sort(int* a, int first, int last, int* a1)
{
if (first < last)
{
int mid = (first + last) / 2; //当last=1 mid被强制转换为0,递归终止条件生效
merge_sort(a, first, mid, a1);
merge_sort(a, mid + 1, last, a1); //当mid+1=last时相当于不执行
merge(a, first, mid, last, a1);
}
}
main.cpp
#include"head.h"
int main()
{
int *a= new int[20];
int *a1 = new int[20];
int len;
cout << "输入随机数组元素个数" << endl;
cin >> len;
cout << endl;
cout << "生成一个元素个数为" << len << "的随机数组" << endl;
Array_generate(a, len);
cout << endl;
merge_sort(a, 0,len-1 , a1);//归并排序
cout << "归并排序结果如下:" << endl;
for (int i = 0; i < len; ++i)
cout << setw(3)<<a[i];
delete[]a;
delete[]a1;
return 0;
}
来源:CSDN
作者:Storm chaser,
链接:https://blog.csdn.net/weixin_42199022/article/details/104267033