归并排序的非递归写法
核心:
通过while循环控制gap
通过for循环控制归并的区间
但要注意begin2和end2,如果超过n-1的话就会将随机数拷贝到原数组中,从而引发报错。
通过调试可以发现报错是由于随机值引发的。
void merge_sort_non(int* a, int n)
{int gap = 1;//每组数据的个数--->及刚开始一个一个归//int* tmp = new int[n];int* tmp = new int[n];while (gap < n){for (int i = 0; i < n; i += 2 * gap){//[i,i+gap-1][i+gap,i+2*gap-1]int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap , end2 = i + 2 * gap - 1;//归并过程中右半区间可能就不存在if (begin2 >= n){break;//左边有序,右边没有就不需要归并了}//归并过程中右半区间算多了if (end2 >= n){end2 = n - 1;}int index = i;//while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){tmp[index++] = a[begin1++];}else{tmp[index++] = a[begin2++];}}while (begin1 <= end1){tmp[index++] = a[begin1++];}while (begin2 <= end2){tmp[index++] = a[begin2++];}for (int j = i; j <= end2; ++j)//防止区间的左边存在问题{//归完之后立刻拷贝回去,防止将tmp中的随机值也考入a中a[j] = tmp[j];}}gap *= 2;}delete[] tmp;
}