非递归实现二路归并排序
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();
}
}