排序4---归并排序

目录

算法步骤

算法演示

代码

时间复杂度

空间复杂度


算法步骤

分:将数组依次分割成两半,直到子数组只存在一个数

合:先准备一个空数组,存放合并后的结果,依次取出相邻两个子数组的首元素,比较大小,小的先存入数组,依次遍历各个元素。

算法演示

排序4---归并排序_第1张图片

代码

void Sort::mergeArray(vector& arr,vector left, vector right)
{
	vector res;  //临时数组 存放排序完成后的结果
					//如果直接存到arr,在后续push_back过程,首个元素并不是插入在arr首地址
	int index_l = 0;
	int index_r = 0;
	while ((index_l < left.size()) && (index_r< right.size()))
	{
		 
		if (left[index_l] < right[index_r])
		{
			res.push_back(left[index_l]);
			index_l++;  //数组首元素后移
		}

		else
		{
			res.push_back(right[index_r]);
			index_r++;
		}
	}
	while (index_l::iterator it = arr.begin(); it != arr.end(); it++)
		{
			*it = res[index++];
		}
	}
}



void Sort::mergeSort(vector& arr)
{
	int len = arr.size();
	if (len < 2)
	{
		return;
	}
	int middle = len / 2;
	vector left;
	vector right;
	for (int i = 0; i < middle; i++)
	{
		left.push_back(arr[i]);
	}
	for (int j = middle; j < len; j++)
	{
		right.push_back(arr[j]);
	}
	mergeSort(left);
	mergeSort(right);
	mergeArray(arr, left, right);
}

时间复杂度

O(nlogn)

空间复杂度

O(n)

你可能感兴趣的:(数据结构,排序算法,算法)