void merge(int Array[], int first, int mid, int last) { int Array1[10]; int first1 = first; int last1 = mid; int first2 = mid + 1; int last2 = last; int index = first1;//这里index赋值为first,而并不是0,是因为函数传进的值往往不从0开始。 while ((first1 <= last1) && (first2 <= last2)) { if (Array[first1] <= Array[first2]) { Array1[index] = Array[first1]; first1++; } else { Array1[index] = Array[first2]; first2++; } index++; } while (first2 <= last2)//1 { Array1[index] = Array[first2]; first2++; index++; } while (first1 <= last1)//2 { Array1[index] = Array[first1]; first1++; index++; } cout << endl; for (index = first; index <= last; index++)//这里index的值也是相同理由。 { Array[index] = Array1[index]; } cout << endl; } void mergeSort(int Array[], int first, int last) { if (first < last) { int mid = first + (last - first) / 2; cout << "1 "<<first << " " << mid << " " << last << endl; mergeSort(Array, first, mid); cout <<"2 "<< first << " " << mid << " " << last << endl; mergeSort(Array, mid + 1, last); cout <<"3 "<< first << " " << mid << " " << last << endl; merge(Array, first, mid, last); } }
首先递归,可以很明显看出,递归是从第一个函数一层一层执行下去,直至变为一个元素。
在执行第二个函数,再次生成单元素数组;执行第三个函数合并数组,重复,直至到函数执行结束。
在合并函数中,第二个和第三个循环是用来将未存入临时数组的数据存入,因为是有序数组,
所以只存在一个数组为完全存入,且数据已完成排序,即之后元素之直接复制就好,
不在需要任何操作。则这两个循环可以互调位置,不影响程序结果。
程序代码来至C++数据抽象与问题求解(第六版)
归并排序算法心得
最新推荐文章于 2024-02-02 07:45:00 发布