//归并排序非递归 void merge(elementType initList[], elementType mergeList[], int i, int m, int n)//归并两个有序的子表 { //i为第一个子表开始的位置m第一个子表元素的个数 ,n为第二个子表的个数 int j = m + 1; int k = i; while (i <= m && j <= n) { if (mergeList[i] <= mergeList[j]) initList[k++] = mergeList[i++]; else initList[k++] = mergeList[j++]; } if (i > m) for (int t = j; t <= n; t++) initList[k++] = mergeList[t]; else for (int t = i; t <=m; t++) initList[k++] = mergeList[t]; } void mergePass(elementType initList[], elementType mergeList[], int n, int s) //每一次合并 { int i; for (i = 1; i <= n - 2 * s + 1; i += 2 * s) merge(initList, mergeList, i, i + s - 1, i + 2 * s - 1); if (i + s - 1 < n) merge(initList, mergeList, i, i + s - 1, n); else for (int j = i; j <= n; j++) initList[j] = mergeList[j]; } void mergeSort( elementType mergeList[], int n) //控制合并的次数以及合并区间大小 { elementType initList[100]; int s = 1; while (s < n) { mergePass(initList, mergeList, n, s); s *= 2; mergePass(mergeList, initList, n, s); s *= 2; } }
//归并排序非递归
void merge( elementType mergeList[], int r, int m, int n) { int n1 = m - r + 1; int n2 = n - m; elementType *Left = new elementType[n1+1], *Right = new elementType[n2+1]; for (int i = 1; i <= n1; i++)//将子集1放到Left数组中 { Left[i] = mergeList[r + i-1]; } for (int i = 1; i <= n2; i++)////将子集2放到Right数组中 { Right[i] = mergeList[m + i]; } int i = 1, j = 1, k = r; while (i <= n1&&j <= n2)//开始合并 { if (Left[i] <= Right[j])//为了稳定性要= mergeList[k++] = Left[i++]; else mergeList[k++] = Right[j++]; } if (i > m)//处理多余的数集 { for (int t = j; t <= n2;t++) { mergeList[k++] = Right[t]; } } else { for (int t = i; t <= n1; t++) { mergeList[k++] = Left[t]; } } delete []Left;//注意对内存释放 delete []Right; } void mergeSort( elementType mergeList[], int Left, int Right) { if (Left >= Right) return; //要有递归出口 mergeSort( mergeList, Left, (Left + Right) / 2); //分 mergeSort( mergeList, (Left + Right) / 2 + 1, Right); merge( mergeList, Left, (Left + Right) / 2 , Right);//合并 }