归并排序之——二路归并(c/c++)

本文详细介绍了二路归并排序算法,通过实例演示了排序过程。从初始数列开始,经过多次归并操作,最终得到完全排序的数列。文章提供了完整的C++代码实现,展示了如何使用分治法进行高效排序。

(二路)归并排序指的是将两个顺序序列合并成一个顺序序列的方法。它是采用分治法的一个典型应用。

如 设有数列初始状态为:6,202,100,301,38,8,1

第一次归并后:{6,202},{100,301},{8,38},{1}

第二次归并后:{6,100,202,301},{1,8,38}

第三次归并后:{1,6,8,38,100,202,301}

归并排序时间复杂度为o(nlogn),空间复杂度为o(n),是一种稳定的排序方法。

完整代码如下:

  #include<iostream>
  #define N 20
  void mergeSort(int* arr, int s,int t);
  void merge(int* arr, int s, int m,int t);
  int temp[N];//备用数组temp
  int main()
  {
	  int a[N] = { 3, 2, 4, 6, 7, 5, 18, 9, 0, 1,
		  16, 8, 20, 33, 28, 64, 19, 31, 30, 25 };
	  for (int i = 0; i <N; i++)
	  {
		  std::cout << a[i] << "  ";
	  }
	  std::cout << '\n'; 
	  mergeSort(a,0,N-1);
	  for (int i = 0; i <N; i++)
	  {
		  std::cout << a[i] << "  ";
	  }
	  std::cout << '\n';
	  return 0;
  }

  void mergeSort(int* arr, int s, int t)
  {
	  if (s < t)
	  {
		  int m = (s + t) / 2;
		  mergeSort(arr, s, m);
		  mergeSort(arr, m + 1, t);
		  merge(arr, s, m, t);
	  }
  }
  void merge(int* arr, int s, int m, int t)
  {
	  int i, j;//i表示在temp中的下标,下面初始化为0;
	  int start = s;//start保留arr数组中归并的起始位置 s,方便后面copy;
	  for (j = m + 1,i=0; j <= t&&s<= m;++i) s为前半部分有序数组起始下标,j为后半部分;
	  {
		  if (arr[s] <= arr[j])//保证排序的稳定性(不能写成arr[s]<arr[j])
			  temp[i] = arr[s++];
		  else
			  temp[i] = arr[j++];
	  }
      while (s <= m)
		  temp[i++] = arr[s++];
	  while (j<=t)
		  temp[i++] = arr[j++];

	  i = 0;
	  while (start <= t)//copy排好序的数。
		  arr[start++] = temp[i++];
  }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值