我有一个二维数组,想根据第一行中元素的顺序对两行进行排序:
我开始:
第 1 行:{ 4、3、1、5、0}
第 2 行:{ 7、8、9、1、2}
结果应该是:
第 1 行:{ 0, 1, 3, 4, 5}
第 2 行:{ 2, 9, 8, 7, 1}
问题:是否有可能通过使用 qsort() 函数来实现这一点?
我想,这样是可以做到的。
#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;
}
输出 :
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
不是直接...
...但qsort()
可以按每个向量的第一个元素对向量进行排序。
所以需要将示例数据转置并转换成一个假的二维数组,其中根指针指向一个指针数组,每个指针都指向转置后的原始数据的一行。
qsort()
然后传递根指针,比较函数比较向量的第一个元素。向量通过引用传递给比较函数。
排序完成后,需要将结果转换为调用qsort()
.