数据结构课程设计 ADT 实现非递归二路归并排序

非递归实现二路归并排序

fxy的oj题 仅供自己记录,严禁抄袭到oj上,有查重系统查得出来的

所用的线性表头元素为空

template<class ElemType>
void Merge(SqList<ElemType>& A, int low, int mid, int high) //low为第1有序区的第1个元素,mid为第1有序区的最后1个元素
{
 int k, j;
 int h = low;
 ElemType a[1000];
 for (k = 0, j = mid + 1; low <= mid && j <= high;) {
  if (A.compare(low, j)>=0) {
   a[k++] = A.getElem(j++);
  }
  else
   a[k++] = A.getElem(low++);
 }
 //将剩下没有比的元素放入数组a
 if (low <= mid) {
  while(low <= mid)a[k++] = A.getElem(low++);
 }
 if (j <= high) {
  while (j <= high)a[k++] = A.getElem(j++);
 }
 //从数组拷到原来的队列
 for (int i = 0; i < k; i++) {
  A.setElem(h++, a[i]);
 }
}
template<class ElemType>
void MergeSort(SqList<ElemType>& A)
{
 int len = 1;//每次归并的长度
 bool f = false;
 //cout <<endl<<"lll"<< A.ListLength();
 while (len < A.ListLength()) {
  for (int i = 1; i < A.ListLength(); i =i+ 2 * len) {
   if (i + len-1 >= A.ListLength())continue;//末尾第一列越界   不管
   else if (i + 2 * len-1 >= A.ListLength())//末尾第二列越界   不等长的两列归并
    Merge(A, i, i + len-1, A.ListLength());
   Merge(A, i, i + len-1, i + len * 2-1);
  }
  len *= 2;//归并长度加倍
  if(f) cout << endl;
  f = true;
  A.dispayList();
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值