合并排序代码未提供所需的输出
Merge Sort Code Not Giving Desired Output
刚开始学习递归。问题是合并排序,我试图在不打破两个数组的情况下解决它,所以我传递了开始索引 (si) 和结束索引 (end)。
#include <iostream>
using namespace std;
void inputArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
}
void printArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
void mergeArray(int a[], int si, int end)
{
int mid = (si + end) / 2;
int size = end - si + 1;
int temp[size];
int index = 0, i = si, j = mid + 1;
while (i <= mid && j <= end)
{
if (a[i] <= a[j])
{
temp[index] = a[i];
index++;
i++;
}
else
{
temp[index] = a[j];
index++;
j++;
}
}
if (i > mid)
{
while (j <= end)
{
temp[index] = a[j];
index++;
j++;
}
}
if (j > end)
{
while (i <= mid)
{
temp[index] = a[i];
index++;
i++;
}
}
//Copying Content Of Temp Array Back To Original Array
int k=0;
for (i = si; i < size; i++)
{
a[i] = temp[k];
k++;
}
}
void mergeSort(int a[], int si, int end)
{
if (si >= end)
{
return;
}
int mid = (si + end) / 2;
mergeSort(a, si, mid);
mergeSort(a, mid + 1, end);
mergeArray(a, si, end);
}
int main()
{
int a[100];
int n;
cin >> n;
inputArray(a, n);
mergeSort(a, 0, n - 1);
printArray(a, n);
return 0;
}
抱歉,代码太长,它在以下情况下失败:6 5 4 3
(按降序排列)但适用于其他情况,例如 6 5 4 9
我从昨天开始尝试调试这段代码,有人可以帮我吗
void merge(int arr[], int start, int mid, int end) {
int n1 = mid - start + 1, n2 = end - mid, a1[n1], a2[n2];
for(int i = 0; i < n1; ++i) a1[i] = arr[i + start];
for(int i = 0; i < n2; ++i) a2[i] = arr[mid + 1 + i];
int i = 0, j = 0, k = start;
while(i < n1 && j < n2) {
if(a1[i] < a2[j]) {
arr[k++] = a1[i++];
}
else arr[k++] = a2[j++];
}
if(i < n1) arr[k++] = a1[i++];
if(i < n2) arr[k++] = a2[j++];
}
void mergeSort(int *arr, int start, int end) {
if(start >= end) return;
int mid = start + (end - start) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
merge(arr, start, mid, end);
}
试试这个逻辑
已修复,谢谢大家!
#include <iostream>
using namespace std;
void inputArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
}
void printArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
void mergeArray(int a[], int si, int end)
{
int mid = (si + end) / 2;
int size = end - si + 1;
int temp[size];
int index = 0;
int i = si;
int j = mid + 1;
while (i <= mid && j <= end)
{
if (a[i] <= a[j])
{
temp[index] = a[i];
index++;
i++;
}
else
{
temp[index] = a[j];
index++;
j++;
}
}
while (j <= end)
{
temp[index] = a[j];
index++;
j++;
}
while (i <= mid)
{
temp[index] = a[i];
index++;
i++;
}
index = 0;
for (i = si; i <= end; i++)
{
a[i] = temp[index];
index++;
}
}
void mergeSort(int a[], int si, int end)
{
if (si >= end)
{
return;
}
int mid = (si + end) / 2;
mergeSort(a, si, mid);
mergeSort(a, mid + 1, end);
mergeArray(a, si, end);
}
int main()
{
int a[100];
int n;
cin >> n;
inputArray(a, n);
mergeSort(a, 0, n - 1);
printArray(a, n);
return 0;
}
刚开始学习递归。问题是合并排序,我试图在不打破两个数组的情况下解决它,所以我传递了开始索引 (si) 和结束索引 (end)。
#include <iostream>
using namespace std;
void inputArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
}
void printArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
void mergeArray(int a[], int si, int end)
{
int mid = (si + end) / 2;
int size = end - si + 1;
int temp[size];
int index = 0, i = si, j = mid + 1;
while (i <= mid && j <= end)
{
if (a[i] <= a[j])
{
temp[index] = a[i];
index++;
i++;
}
else
{
temp[index] = a[j];
index++;
j++;
}
}
if (i > mid)
{
while (j <= end)
{
temp[index] = a[j];
index++;
j++;
}
}
if (j > end)
{
while (i <= mid)
{
temp[index] = a[i];
index++;
i++;
}
}
//Copying Content Of Temp Array Back To Original Array
int k=0;
for (i = si; i < size; i++)
{
a[i] = temp[k];
k++;
}
}
void mergeSort(int a[], int si, int end)
{
if (si >= end)
{
return;
}
int mid = (si + end) / 2;
mergeSort(a, si, mid);
mergeSort(a, mid + 1, end);
mergeArray(a, si, end);
}
int main()
{
int a[100];
int n;
cin >> n;
inputArray(a, n);
mergeSort(a, 0, n - 1);
printArray(a, n);
return 0;
}
抱歉,代码太长,它在以下情况下失败:6 5 4 3
(按降序排列)但适用于其他情况,例如 6 5 4 9
我从昨天开始尝试调试这段代码,有人可以帮我吗
void merge(int arr[], int start, int mid, int end) {
int n1 = mid - start + 1, n2 = end - mid, a1[n1], a2[n2];
for(int i = 0; i < n1; ++i) a1[i] = arr[i + start];
for(int i = 0; i < n2; ++i) a2[i] = arr[mid + 1 + i];
int i = 0, j = 0, k = start;
while(i < n1 && j < n2) {
if(a1[i] < a2[j]) {
arr[k++] = a1[i++];
}
else arr[k++] = a2[j++];
}
if(i < n1) arr[k++] = a1[i++];
if(i < n2) arr[k++] = a2[j++];
}
void mergeSort(int *arr, int start, int end) {
if(start >= end) return;
int mid = start + (end - start) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
merge(arr, start, mid, end);
}
试试这个逻辑
已修复,谢谢大家!
#include <iostream>
using namespace std;
void inputArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
}
void printArray(int a[], int n)
{
for (int i = 0; i < n; i++)
{
cout << a[i] << " ";
}
cout << endl;
}
void mergeArray(int a[], int si, int end)
{
int mid = (si + end) / 2;
int size = end - si + 1;
int temp[size];
int index = 0;
int i = si;
int j = mid + 1;
while (i <= mid && j <= end)
{
if (a[i] <= a[j])
{
temp[index] = a[i];
index++;
i++;
}
else
{
temp[index] = a[j];
index++;
j++;
}
}
while (j <= end)
{
temp[index] = a[j];
index++;
j++;
}
while (i <= mid)
{
temp[index] = a[i];
index++;
i++;
}
index = 0;
for (i = si; i <= end; i++)
{
a[i] = temp[index];
index++;
}
}
void mergeSort(int a[], int si, int end)
{
if (si >= end)
{
return;
}
int mid = (si + end) / 2;
mergeSort(a, si, mid);
mergeSort(a, mid + 1, end);
mergeArray(a, si, end);
}
int main()
{
int a[100];
int n;
cin >> n;
inputArray(a, n);
mergeSort(a, 0, n - 1);
printArray(a, n);
return 0;
}