归并排序

╄→гoц情女王★ 提交于 2020-02-11 21:19:29

归并排序

归并排序(英语: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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!