Сортировка двумерного массива в языке Си производится только по первому столбцу


У меня есть массив двойного типа с 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 4

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;

И затем вы объявляете массив этой структуры:

my_data_t arr [1000];
Теперь ваш вопрос сужается до "как отсортировать массив x". В интернете можно найти много информации об этом. Если вы не хотите реализовывать алгоритм сортировки самостоятельно (что вы будете делать только в образовательных целях), я бы предложил использовать функцию qsort () в stdlib.х. Для этого qsort, который работает, является : qsort (Арр оператор sizeof(ОБР)/оператор sizeof(*Арр), оператор sizeof(*Арр), менее);

Для 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");
        }
}