想利用c語言中的qsort功能對二維數組做排序,但嘗試一些辦法後,結果都只能以其中一列為基準做排序,想請問各位該如何修改這部分,謝謝大家
#include <stdio.h>
#include<stdlib.h>
long long int data[1000000][2];
int compare(const void *a, const void *b)
{
if(*((long long int*)a) < *((long long int*)b)){
return -1;
}
else if(*((long long int*)a) > *((long long int*)b)){
return 1;
}
else{
return 1;
}
}
int main(){
int N;
long long int j = 0, result = 0;
scanf("%d", &N);
for(int i = 0; i < N; i++){
scanf("%lld%lld", &data[i][0], &data[i][1]);
}
qsort(data, N, sizeof(data[0]), compare);
for(int l = 0; l < N; l++){
printf("sort : %lld.%lld\n", data[l][0], data[l][1]);
}
return 0;
}
比較第一個數字,如果相等的話必須比較第二個數字
int compare(const void* a, const void* b)
{
long long int a0 = *(long long int*)a;
long long int a1 = *((long long int*)a + 1);
long long int b0 = *(long long int*)b;
long long int b1 = *((long long int*)b + 1);
if (a0 != b0) {
return a0 < b0 ? -1 : 1;
} else {
return a1 < b1 ? -1 : (a1 == b1 ? 0 : 1);
}
}
另一個寫法
int compare(const void* a, const void* b)
{
long long int *p1 = (long long int *)a;
long long int *p2 = (long long int *)b;
if(p1[0] != p2[0]) {
return p1[0] < p2[0] ? -1 : 1;
} else {
return p1[1] < p2[1] ? -1 : (p1[1] == p2[1] ? 0 : 1);
}
}
因為你要的只是選擇(我看來語意如此),所以丟個參考:
(淺水員大的 if
部分很好用,研究一下!)
#include <stdio.h>
#include <stdlib.h>
// "long long int" 太煩了,所以用 typedef;如有必要自己改回去。(例如專案整合啥的。)
typedef long long int tLLI ;
typedef tLLI *tLLIP ;
//
long long int data[1000000][2];
int gIndex = 0 ; // global: data 的第二維的索引用;
//
int compare(const void *a, const void *b)
{
if(*((long long int*)a) < *((long long int*)b)){
return -1;
}
else if(*((long long int*)a) > *((long long int*)b)){
return 1;
}
else{
return 1;
}
}
//
int myCompare02(const void *a, const void *b)
{
// 以「第 1 +gIndex 個」元素的差為比較依據; gIndex: global: data 的二維索引用;
return *((tLLIP)a + gIndex) < *((tLLIP)b + gIndex)
? -1 : *((tLLIP)a + gIndex) > *((tLLIP)b + gIndex);
}
//
int myCompare03(const void *a, const void *b)
{
// 海綿寶寶大神所附連結方式(自己做好玩+練習的。)
const tLLI * const ia = a, * const ib = b;
return ia[gIndex] < ib[gIndex] ? -1 : ia[gIndex] > ib[gIndex];
}
//
int main(){
int N;
long long int j = 0, result = 0;
scanf("%d", &N);
for(int i = 0; i < N; i++){
scanf("%lld%lld", &data[i][0], &data[i][1]);
}
printf("compare:\n");
qsort(data, N, sizeof(data[0]), compare);
for(int l = 0; l < N; l++){
printf("sort : %lld.%lld\n", data[l][0], data[l][1]);
}
//
gIndex = 0 ; printf("myCompare02, gIndex:=[%d]:\n", gIndex);
qsort(data, N, sizeof (*data), myCompare02);
for(int l = 0; l < N; l++){
printf("sort : %lld.%lld\n", data[l][0], data[l][1]);
}
//
gIndex = 1 ; printf("myCompare02, gIndex:=[%d]:\n", gIndex);
qsort(data, N, sizeof (*data), myCompare02);
for(int l = 0; l < N; l++){
printf("sort : %lld.%lld\n", data[l][0], data[l][1]);
}
//
gIndex = 0 ; printf("myCompare03, gIndex:=[%d]:\n", gIndex);
qsort(data, N, sizeof (*data), myCompare03);
for(int l = 0; l < N; l++){
printf("sort : %lld.%lld\n", data[l][0], data[l][1]);
}
//
gIndex = 1 ; printf("myCompare03, gIndex:=[%d]:\n", gIndex);
qsort(data, N, sizeof (*data), myCompare03);
for(int l = 0; l < N; l++){
printf("sort : %lld.%lld\n", data[l][0], data[l][1]);
}
//
return 0;
}