想利用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;
}