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?
You can simply use STL to sort 2D array row-wise..
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.
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.
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.
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
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()
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With