1、算法描述:将若干有序序列逐步归并,最张归并为一个有序序列。这里用二路归并的非递归算法。
2、函数myMerge:一次归并,实现两个序列的归并
/** * Function : 归并排序(ASC) * Param : (int array)待排数组 * Param : (int array)已排数组 * Param : (int)第一个序列的起始下标 * Param : (int)第一个序列的末尾下标 * Param : (int)第二个序列的末尾下标 * Return : No */ void myMerge(int data[], int data1[], int s, int m, int t) { int i = s; int j = m + 1; int k = s; while (i <= m && j <= t) { if (data[i] <= data[j]) //取data[i], data[j]中较小者放入data1[] { data1[k++] = data[i++]; } else { data1[k++] = data[j++]; } } //收尾处理 while (i <= m) data1[k++] = data[i++]; while (j <= t) data1[k++] = data[j++]; }
2、函数mergeSort:一趟归并,将整个数组的序列两两归并
/** * Function : 归并排序(ASC) * Param : (int array)待排数组 * Param : (int array)已排数组 * Param : (int)数组长度 * Param : (int)子序列的长度 * Return : No */ void mergePass(int data[], int data1[], int n, int h) { int i = 0; while (i <= n - 2 * h) { myMerge(data, data1, i, i + h - 1, i + 2 * h - 1); i += 2 * h; } if (i < n - h)//有一个子序列长度小于h { myMerge(data, data1, i, i + h - 1, n - 1); } else //只剩下一个子序列 { for (int k = i; k < n; ++k) data1[k] = data[k]; } }
3、归并排序的非递归算法:
/** * Function : 归并排序(ASC) * Param : (int array)待排数组 * Param : (int)数组长度 * Return : No */ void mergeSort(int data[], int n) { int h = 1; int *data1 = new int[n]; while (h < n) { mergePass(data, data1, n, h); h *= 2; mergePass(data1, data, n, h); h *= 2; } //has a problem here //delete[] data1; }