Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sorting 2-dimensional array in ANSI C with qsort()

I have a two dimensional array and want to sort both rows depending on the order of the elements in the first row:

i start with:

row1: { 4, 3, 1, 5, 0}

row2: { 7, 8, 9, 1, 2}

and the result should be:

row1: { 0, 1, 3, 4, 5}

row2: { 2, 9, 8, 7, 1}

QUESTION: Is it possible to achieve this, by using the qsort() function?

like image 423
andreas Avatar asked Sep 26 '13 15:09

andreas


People also ask

Can you sort a 2D array in C?

You can simply use STL to sort 2D array row-wise..

What sort does qsort use?

As the name suggests, qsort function uses QuickSort algorithm to sort the given array, although the C standard does not require it to implement quicksort.

What is qsort function in C?

The qsort() is a C library function that uses a quick sort algorithm to sort an array. Here is how it is declared in C: A void pointer is a pointer that can point to any datatype. The most interesting part of the syntax above is the comparator function. It is called by qsort() , multiple times, to compare two elements.

How do you sort a 2D array?

Make the 2D array into a separate simple (1D) array (STEP 1). Then use the Arrays. sort() method to sort the simple array (STEP 2). Then set each space of the 2D array to be the number of columns across (X-coordinate where the space will be changed) multiplied by the number of spaces per row in the 2D array.


2 Answers

I think ,that way it could be done.

#include<bits/stdc++.h>
using namespace std;

int cmp(const void *a,const void *b) {
    return ((const int *)a)[0] - ((const int *)b)[0];
}

int main(int argc,char *argv[]){
    int list[10][2];
    printf("Before sorting\n");
    for(int i=0; i<10; i++){ 
        list[i][0] = rand()%31;
        list[i][1] = rand()%12;
        printf ("list[%d][0] = %d list[%d][1] = %d\n", i, list[i][0], i, list[i][1]);
    }
    printf("AFTER sorting\n");
    qsort(list,10,2*sizeof(int),cmp);
    for(int i=0; i<10; i++)
        printf ("list[%d][0] = %d list[%d][1] = %d\n", i, list[i][0], i, list[i][1]);
    return 0;
}

Output :

Before sorting
list[0][0] = 10 list[0][1] = 11
list[1][0] = 10 list[1][1] = 4
list[2][0] = 11 list[2][1] = 4
list[3][0] = 8 list[3][1] = 6
list[4][0] = 23 list[4][1] = 8
list[5][0] = 1 list[5][1] = 5
list[6][0] = 0 list[6][1] = 3
list[7][0] = 10 list[7][1] = 11
list[8][0] = 19 list[8][1] = 2
list[9][0] = 22 list[9][1] = 0
AFTER sorting
list[0][0] = 0 list[0][1] = 3
list[1][0] = 1 list[1][1] = 5
list[2][0] = 8 list[2][1] = 6
list[3][0] = 10 list[3][1] = 11
list[4][0] = 10 list[4][1] = 4
list[5][0] = 10 list[5][1] = 11
list[6][0] = 11 list[6][1] = 4
list[7][0] = 19 list[7][1] = 2
list[8][0] = 22 list[8][1] = 0
list[9][0] = 23 list[9][1] = 8
like image 82
Shinora007 Avatar answered Sep 19 '22 00:09

Shinora007


Not directly ...

... but qsort() could sort vectors by each vector's first element.

So the example data needed to be transposed and be converted into a fake 2d array, where the root pointer points to an array of pointers, with each pointer pointing to a row of the transposed original data.

qsort() then is passed the root pointer and the compare function compares on the vectors' first element. The vectors are passed to compare function by reference.

After sorting is done the result then needs to be converted the revers way as done prior to the call to qsort().

like image 44
alk Avatar answered Sep 17 '22 00:09

alk