修改代码:#include<iostream> using namespace std; void Merge(int arr[], int low, int mid, int high) { // low是第一个有序区的第一个元素,i指向它。 // mid是第一个有序区的最后一个元素。 int i = low, j = mid - 1, k = 0; // mid+1是第二个有序区的第一个元素,j指向它。 int* temp = new(nothrow) int[high - low + 1]; // temp数组暂时存放合并后的有序序列。 if (!temp) { // 内存分配失败。 cout << "error"; return; } //请补充实现合并过程 while(low<=j && j<=high) if(arr[low]<=arr[mid]) temp[i++]=move(arr[low++]); else temp[i++]=move(arr[mid++]); while(low<=j) temp[i++]=move(arr[low++]); while(j<=high) temp[i++]=move(arr[mid++]); for(k=0;k<(high - low + 1);++k,--high) arr[high]=move(temp[high]); delete[]temp; // 删除指针。由于它指向数组,必须使用delete[]。 } // 利用分治法通过递归实现归并排序。 void MergeSort(int arr[], int low, int high) { //请实现递归合并 if(low<high) { int center=(low+high)/2; MergeSort(arr,low,center); MergeSort(arr,center+1,high); Merge(arr,low,center+1,high); } } int main(int argc, char* argv[]) { int num; cin >> num; int* a = (int*)malloc(sizeof(int) * num); //int a[num]; for (int i = 0; i < num; i++) { cin >> a[i]; } MergeSort(a, 0, num - 1); for (int i = 0; i < num; i++) { cout << a[i] << " "; } return 0; }
时间: 2024-01-19 10:04:22 浏览: 81
使用include <iostream>时一定要加using namespace std
修改后的代码如下:
```
#include<iostream>
using namespace std;
void Merge(int arr[], int low, int mid, int high) {
int i = low, j = mid, k = 0;
int* temp = new (nothrow) int[high - low + 1];
if (!temp) {
cout << "error";
return;
}
// 合并两个有序区
while (i < mid && j <= high) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
}
else {
temp[k++] = arr[j++];
}
}
while (i < mid) {
temp[k++] = arr[i++];
}
while (j <= high) {
temp[k++] = arr[j++];
}
// 将有序序列复制回原数组
for (int i = low, k = 0; i <= high; i++, k++) {
arr[i] = temp[k];
}
delete[]temp;
}
void MergeSort(int arr[], int low, int high) {
if (low < high) {
int mid = (low + high) / 2;
MergeSort(arr, low, mid);
MergeSort(arr, mid + 1, high);
Merge(arr, low, mid + 1, high);
}
}
int main(int argc, char* argv[]) {
int num;
cin >> num;
int* a = new (nothrow) int[num];
for (int i = 0; i < num; i++) {
cin >> a[i];
}
MergeSort(a, 0, num - 1);
for (int i = 0; i < num; i++) {
cout << a[i] << " ";
}
delete[]a;
return 0;
}
```
主要修改内容如下:
1. 在Merge函数中,将变量j的初始值改为mid,同时将合并两个有序区的循环条件改为i < mid && j <= high,以保证两个有序区都能被遍历到;
2. 在Merge函数中,将合并后的有序序列先存入临时数组temp中,再将有序序列复制回原数组arr;
3. 在main函数中,使用new (nothrow)动态分配内存,避免内存分配失败时程序崩溃;
4. 在程序结束时,使用delete[]释放动态分配的内存。
阅读全文