iT邦幫忙

1

排序問題

  • 分享至 

  • xImage

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

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
2
淺水員
iT邦大師 6 級 ‧ 2022-12-18 23:11:23
最佳解答

比較第一個數字,如果相等的話必須比較第二個數字

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);
    }
}
re.Zero iT邦研究生 5 級 ‧ 2022-12-19 01:48:07 檢舉

宣告 compare 回傳類型 int,而 return (long long int),我總覺得會出事……

淺水員 iT邦大師 6 級 ‧ 2022-12-19 11:10:24 檢舉

謝謝告知,剛剛修正了。

anjuik iT邦新手 5 級 ‧ 2022-12-21 13:57:37 檢舉

了解了謝謝,目前問題解決了

1
海綿寶寶
iT邦大神 1 級 ‧ 2022-12-18 16:38:20

參考這篇看看可不可用

anjuik iT邦新手 5 級 ‧ 2022-12-18 19:58:23 檢舉

好的我嘗試看看,謝謝

2
re.Zero
iT邦研究生 5 級 ‧ 2022-12-19 02:00:51

因為你要的只是選擇(我看來語意如此),所以丟個參考:
(淺水員大的 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;
}
anjuik iT邦新手 5 級 ‧ 2022-12-21 13:56:44 檢舉

好的謝謝

我要發表回答

立即登入回答