面试算法题目. 重温. 归并排序算法

本文深入讲解了归并排序算法的实现原理,展示了如何通过递归将数组分为更小的部分进行排序,然后合并这些部分以得到最终排序结果。文章提供了详细的C++代码实现,包括merge和mergeSort函数的定义及调用过程。

对于归并排序:

  1. 归并排序是稳定的
  2. 归并排序时间复杂度为o(nlog(n))
#include<Windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>

/* stl */
#include<vector>
#include<algorithm>
#include<queue>
#include<deque>
#include<stack>
#include<list>
#include<map>

#include<unordered_map>
#include<unordered_set>

using namespace std;

// 归并排序
void merge(vector<int>& nums, int lo, int mid, int hi, vector<int> &assist) {
	
	int i = lo;
	int j = mid + 1;
	int n = 0;

	while (i <= mid || j <= hi) {

		while (i > mid && j <= hi)
			assist[n++] = nums[j++];

		while (j > hi && i <= mid)
			assist[n++] = nums[i++];

		if (i > mid && j > hi)
			break;

		if (nums[i] <= nums[j]) {
			assist[n++] = nums[i++];
			continue;
		}
		assist[n++] = nums[j++];
	}

	for (int k = lo, n = 0; k <= hi; k++, n++)
		nums[k] = assist[n];
}

void mergeSort(vector<int>& nums, int lo, int hi, vector<int> &assist) {

	if (lo >= hi)
		return;

	int mid = (lo + hi) / 2;

	mergeSort(nums, lo, mid, assist);
	mergeSort(nums, mid + 1, hi, assist);
	//merge 操作lo - mid, mid + 1 - hi两个有序数组进行合并
	merge(nums, lo, mid, hi, assist);
}


int main(int argc, char* argv[])
{

	vector<int> nums{ 1,4,34, 67, 9,6, 8, 9, 8, 2,1,2,3,5,7,10,13 };
	vector<int> assist(nums.size(), 0);
	mergeSort(nums, 0, nums.size() - 1, assist);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值