Сортировка двумерного массива в языке Си производится только по первому столбцу
У меня есть массив двойного типа с 2 столбцами и максимальным числом строк 1000, которые я хочу отсортировать на основе первого элемента каждой строки, а затем переместить всю строку. В сущности, я хочу, чтобы второй элемент колонки не имел никакого влияния.
Я представляю массив следующим образом:
Двойное А[1000][2];
В моем основном. Примером A может быть:
18.0 2.0
5.5 3.5
10.0 8.1
4.0 2.5
После сортировки, I хотел бы, чтобы это выглядело так:
4.0 2.5
5.5 3.5
10.0 8.1
18.0 2.0
Также было бы неплохо знать, как его отсортировать в обратном порядке, чтобы он выглядел следующим образом:
Обратите внимание, что сортировка производится только по значению в первом столбце, а затем переключается вся строка.18.0 2.0
10.0 8.1
5.5 3.5
4.0 2.5
Я попробовал использовать довольно стандартный алгоритм сортировки вставки, с простым изменением входного аргумента, чтобы быть двумерным массивом, и имея блок кода внутри функции, которая изменяет оба элемента строки, но я продолжал получать эту ошибку:
Ошибка: массив имеет неполный тип элемента ' double []' sort_double_array (double A [] [], int n) {
Как мне это сделать? Было бы неплохо сделать это с помощью вставки сортировки. Я могу опубликовать функцию, которую использую для сортировки вставки, но она работает идеально подходит для одномерных массивов.
Заранее большое спасибо, действительно застрял здесь.
Ура,
Джеймс.
4 ответа:
Попробуйте объявить функцию как
Многомерный массив должен иметь границы для всех измерений, кроме первого.sort_double_array(double A[][2], int n);
Попробуйте прототипировать функцию сортировки как
void sort_double_array(double *A[], int n)
. Для получения дополнительных бонусных баллов используйтеsize_t
вместоint
.
Для этого конкретного случая звучит так, как будто каждая строка имеет существенное значение, кажется, это какой-то объект? Тогда я бы рекомендовал забыть о 2D-массиве и объявить его массивом структур. Структура будет выглядеть примерно так:
#define N 2 typedef struct { double data [N]; } my_data_t;
И затем вы объявляете массив этой структуры:
Теперь ваш вопрос сужается до "как отсортировать массив x". В интернете можно найти много информации об этом. Если вы не хотите реализовывать алгоритм сортировки самостоятельно (что вы будете делать только в образовательных целях), я бы предложил использовать функцию qsort () в stdlib.х. Для этого qsort, который работает, является : qsort (Арр оператор sizeof(ОБР)/оператор sizeof(*Арр), оператор sizeof(*Арр), менее);my_data_t arr [1000];
Для qsort вы бы реализовали функцию сравнения, используемую сортировкой. Что-то вроде этого:
int less (const void* a, const void* b) { const my_data_t* ptr_a = a; const my_data_t* ptr_b = b; return (int)(ptr_a->data[0] - ptr_b->data[0]); }
Чтобы изменить порядок сортировки, реализуйте аналогичную функцию "больше".
#include<stdio.h> #include<stdlib.h> int main() { int arr[4][2] = {18,2,5,3,10,8,4,2}; int row=4,col=2; int i,j,k=0,x,temp; for(i=0;i<row;i++) { for(j=i+1;j<row;j++) { if(arr[i][k] > arr[j][k]) { for(x=0;x<2;x++) { temp=arr[i][x]; arr[i][x]=arr[j][x]; arr[j][x]=temp; } } } } for(i=0;i<row;i++) { for(j=0;j<col;j++) printf("%d ", arr[i][j]); printf("\n"); } }