我有一個數字陣列a[n],我想非常快地對其進行排序,但我想保存原始位置。所以我想我應該使用二維陣列a[2][n],a[0][n]初始位置和a[1][n]值也是如此。所以我想根據第二行對這個陣列進行排序。例如,我的陣列是
a[2][5] = [{ 0, 1, 2, 3, 4 }, { 10, 30, 40, 20, 50 }];
排序后我想要
a[2][5] = [{ 0, 3, 1, 2, 4 }, { 10, 20, 30, 40, 50 }];
我嘗試更改合并排序,以便它根據第二行對第一行進行排序(并對第二行進行排序),但第 14 行存在分段錯誤,這是我的代碼
#include <stdio.h>
#include <stdlib.h>
void merge(int arr[][201], int l, int m, int r) {
int i, j, k;
int n1 = m - l 1;
int n2 = r - m;
/* create temp arrays */
int L[2][n1], R[2][n2];
/* Copy data to temp arrays L[] and R[] */
for (i = 0; i < n1; i )
L[1][i] = arr[1][l i];
L[0][i] = arr[0][l i];
for (j = 0; j < n2; j )
R[1][j] = arr[1][m 1 j];
R[0][j] = arr[0][m 1 j];
/* Merge the temp arrays back into arr[l..r]*/
i = 0; // Initial index of first subarray
j = 0; // Initial index of second subarray
k = l; // Initial index of merged subarray
while (i < n1 && j < n2) {
if (L[1][i] <= R[1][j]) {
arr[1][k] = L[1][i];
arr[0][k] = L[0][i];
i ;
} else {
arr[1][k] = R[1][j];
arr[0][k] = R[0][j];
j ;
}
k ;
}
/* Copy the remaining elements of L[], if there
are any */
while (i < n1) {
arr[0][k] = L[0][i];
arr[1][k] = L[1][i];
i ;
k ;
}
/* Copy the remaining elements of R[], if there
are any */
while (j < n2) {
arr[1][k] = R[1][j];
arr[0][k] = R[0][j];
j ;
k ;
}
}
/* l is for left index and r is right index of the
sub-array of arr to be sorted */
void mergeSort(int arr[][201], int l, int r) {
if (l < r) {
// Same as (l r)/2, but avoids overflow for
// large l and h
int m = l (r - l) / 2;
// Sort first and second halves
mergeSort(arr, l, m);
mergeSort(arr, m 1, r);
merge(arr, l, m, r);
}
}
void get_array(int length, int array[]) {
for (int i = 0; i < length; i ) {
scanf("%d", &array[i]);
}
}
int main() {
int n;
scanf("%d", &n);
int packages[2][n];
for (int i = 0; i < n; i ) {
packages[0][i]= i;
}
get_array(n, packages[1]);
mergeSort(packages, 0, n);
return 0;
}
我只是想解決這個問題,我可以使用另一個功能。
uj5u.com熱心網友回復:
L和R陣列的初始化回圈是不正確的:你必須使用 C 語言{}將多個陳述句組合為一個塊。與 Python 不同,縮進不決定結構:
for (i = 0; i < n1; i ) {
L[1][i] = arr[1][l i];
L[0][i] = arr[0][l i];
}
for (j = 0; j < n2; j ) {
R[1][j] = arr[1][m 1 j];
R[0][j] = arr[0][m 1 j];
}
此外,您的排序函式需要一個具有固定列數的 2D 陣列201,因此您不能將其傳遞給分配main()有可變列數的陣列。您必須使用固定陣列int packages[2][201];或明確地傳遞n給您的mergeSort和merge函式并arr一致定義。
您應該n - 1在對 的初始呼叫中作為最后一個元素的偏移量傳遞mergeSort()。這種約定容易出錯且令人困惑。
還請注意,merge可以簡化:僅左側部分需要保存,并且需要單個回圈。
這是一個修改后的版本:
#include <stdio.h>
#include <stdlib.h>
void merge(int n, int arr[][n], int l, int m, int r) {
int i, j, k;
int n1 = m - l;
/* create temp array */
int L[2][n1];
/* Copy data to temp array L[] */
for (i = 0; i < n1; i ) {
L[1][i] = arr[1][l i];
L[0][i] = arr[0][l i];
}
/* Merge the temp arrays back into arr[l..r]*/
i = 0; // Initial index of first subarray
j = m; // Initial index of second subarray
k = l; // Initial index of merged subarray
while (i < n1) {
if (j == r || L[1][i] <= arr[1][j]) {
arr[1][k] = L[1][i];
arr[0][k] = L[0][i];
i ;
} else {
arr[1][k] = arr[1][j];
arr[0][k] = arr[0][j];
j ;
}
k ;
}
}
/* l is for left index and r is right index of the
sub-array of arr to be sorted */
void mergeSort(int n, int arr[][n], int l, int r) {
if (r - l > 1) {
// Same as (l r)/2, but avoids overflow for
// large l and h
int m = l (r - l) / 2;
// Sort first and second halves
mergeSort(n, arr, l, m);
mergeSort(n, arr, m, r);
merge(n, arr, l, m, r);
}
}
int main() {
int n = 0;
scanf("%d", &n);
int packages[2][n];
for (int i = 0; i < n; i ) {
packages[0][i] = i;
packages[1][i] = 0;
scanf("%d", &packages[1][i]);
}
mergeSort(n, packages, 0, n);
printf("a[2][%d] = [{ ", n);
for (int i = 0; i < n; i ) {
printf("%d, ", packages[0][i]);
}
printf("}, { ");
for (int i = 0; i < n; i ) {
printf("%d, ", packages[1][i]);
}
printf("}];\n");
return 0;
}
輸出:
5 10 30 40 20 50
a[2][5] = [{ 0, 3, 1, 2, 4, }, { 10, 20, 30, 40, 50, }];
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373380.html
