归并排序C++代码实现(将两个有序数组元素依次比较合并为一个新的有序数组)

@归并排序C++代码实现(将两个有序数组元素依次比较合并为一个新的有序数组)

归并排序分为两个大的步骤,分为划分和归并。归并是将两个有序数组分别为数组A和数组B合并成为一个有序数组,首先取数组A和数组B的第一个元素进行比较,将其中较小的元素放入新的数组中,然后再取出较小元素数组中的下一个元素与另一个数组中的第一个元素进行比较,依然将两者较小的元素放入新的数组中,如此迭代下去,直到将两个数组合并完毕。
划分的话是将划分为多个数组,两两进行归并。最初的是将数组划分为由每一个元素组成的数组,然后两两归并为一个含有两个元素的数组,依次迭代归并为含有四个、八个……元素的数组,直至所有元素归并为一个有序的数组。

方法一:python标准方法(不需要额外的列表空间)

# 标准方法:归并排序
# 该算法的优点就是不用额外的空间,只是在当前的列表中处理
import sys

def merge(left, right):
    i,j = 0, 0
    result = []
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

def Merge_sort(lists):
    if len(lists) <= 1:
        return lists
    num = len(lists)//2
    left = Merge_sort(lists[:num])
    right = Merge_sort(lists[num:])
    return merge(left, right)


if __name__ == '__main__':
    lines = sys.stdin.readlines()
    lists = lines[0].strip().split()
    print("排序前序列为:", )
    for i in lists:
        print(i, end=" ")
    print("\n排序后结果为:")
    for i in (Merge_sort(lists)):
        print(i, end=" ")

方法二:C++标准方法(不需要额外的列表空间)

#include <iostream>
using namespace std;

void Merge(int *initList, int *mergedList, const int l, const int m, const int n);
void MergePass(int *initList, int *resultList, const int n, const int s);
void MergeSort(int *a, int n);

int main()
{
	//int a[] = {0,23,47,81,95,7,14,39,55,62,74};
	//for (int k=0;k<11;k++)
	//{
	//	cout << a[k] << " ";
	//}
	//cout << endl;
	//int b[11] ={0};
	//Merge(a,b,1,4,10);
	//for (int k=0;k<11;k++)
	//{
	//	cout << b[k] << " ";
	//}
	//cout << endl;


	//int m[] = {0,26,5,77,1,61,11,59,15,48,19};
	//int n[11] = {0};
	//for (int k=0;k<11;k++)
	//{
	//	cout << m[k] << " ";
	//}
	//cout << endl;
	//
	//MergePass(m,n,10,1);
	//for (int k=0;k<11;k++)
	//{
	//	cout << n[k] << " ";
	//}
	//cout << endl;

	//MergePass(n,m,10,2);
	//for (int k=0;k<11;k++)
	//{
	//	cout << m[k] << " ";
	//}
	//cout << endl;

	//MergePass(m,n,10,4);
	//for (int k=0;k<11;k++)
	//{
	//	cout << n[k] << " ";
	//}
	//cout << endl;

	//MergePass(n,m,10,8);
	//for (int k=0;k<11;k++)
	//{
	//	cout << m[k] << " ";
	//}
	//cout << endl;

	
	//声明一个数组,并打印出所有的数组元素
	int x[] = {0,26,5,77,1,61,11,59,15,48,19};
	for (int k=0;k<11;k++)
	{
		cout << x[k] << " ";
	}
	cout << endl;
	//将该数组进行归并排序,然后打印出数组中的所有值
	MergeSort(x,10);
	for (int k=0;k<11;k++)
	{
		cout << x[k] << " ";
	}
	cout << endl;
	
	system("pause");
	return 0;
}


void Merge(int *initList, int *mergedList, const int k, const int m, const int n)
{
	int i,j,iresult;
	for(i =k,j = m+1,iresult= k;i<=m && j <=n; iresult++)
	{
		//两个数组中的取出的元素哪个小哪个就放到新的有序数组中
		if (initList[i] <= initList[j])
		{
			mergedList[iresult] = initList[i];
			i++;
		} 
		else
		{
			mergedList[iresult] = initList[j];
			j++;
		}
	}
	copy(initList+i,initList+m+1,mergedList+iresult);   //把initList中从下标i开始,到下标m+1之前的所有元素拷贝到mergedList中下标从iresult开始的数组中
	copy(initList+j,initList+n+1,mergedList+iresult);	//把initList中从下标j开始,到下标n+1之前的所有元素拷贝到mergedList中下标从iresult开始的数组中
}


void MergePass(int *initList, int *resultList, const int n, const int s)
{
	int i;
	for (i =1;i<=n-2*s+1;i+=2*s)
	{
		Merge(initList,resultList,i,i+s-1,i+2*s-1);
	}
	if ((i+s-1)<n)
	{
		Merge(initList,resultList,i,i+s-1,n);
	} 
	else
	{
		copy(initList+i,initList+n+1,resultList+i);
	}
}


void MergeSort(int *a, int n)
{
	int *tempList = new int [n+1];
	for (int i = 1;i<n;i*=2)
	{
		MergePass(a,tempList,n,i);
		i*=2;
		MergePass(tempList,a,n,i);
	}
	delete []tempList;
	tempList = NULL;
}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值