2017-02-24 49 views
-3

我目前正在實現一種邏輯來排序順序中的字母數字上述{2,3 .... 9,A,B,C,D,1,E,F,0}。有沒有一種簡單而可行的方法來做到這一點?我只喜歡C編程。按照提及的順序進行自定義排序{2,3 .... 9,A,B,C,D,1,E,F,0}

該請求是關於FM RDS站的PI代碼中的第一個半字節。由於德國是唯一支持2個PI代碼的國家(D & 1),所以訂單以此方式維護。

在此先感謝你們。

+0

如果你表明你試圖解決的社會將更好地應對。如果您這樣做,我會更新我的答案,爲您提供更全面的答案。 –

+0

通過「字母數字」,你是什麼意思?你想要分類什麼類型? –

+0

@KyleStrand:當我更新我的描述時,我正在對FM RDS工作站的PI代碼中的第一個半字節進行排序。它的範圍從0到F,但是排序順序的期望輸出是{2,3 .... 9,A,B,C,D,1,E,F,0} – Siva

回答

1

你應該寫一個函數(例如,int custom_compare(const void *p1, const void *p2);定義此排序順序,這個方法會返回1如果p1p2後,0如果他們是「平等」,並-1如果p1p2之前。

然後,編寫你的排序方法,並調用你的排序函數,而不是比較使用運算符。也就是,而不是if (a < b),使用if (custom_compare(&b, &a))

此外,我創建了上面的函數原型使用指針作爲參數),因爲它可以與qsort庫一起使用,該庫是一個接受自定義比較函數的快速排序實現。

一種實現

我決定迅速做什麼,我提出了實現和一個小的測試例子。

#include <stdlib.h> 
#include <stdio.h> 

int custom_compare(const void *p1, const void *p2) { 
    char *param1 = (char*)p1; 
    char *param2 = (char*)p2; 
    int loc1 = 0; 
    int loc2 = 0; 
    char order[17] = "23456789ABCD1EF0"; 
    int i; 
    for (i=0; i<17; i++) { 
     if (*param1 == order[i]) { loc1 = i; } 
     if (*param2 == order[i]) { loc2 = i; } 
    } 
    if (loc2 < loc1) { 
     return 1; 
    } else if (loc1 < loc2) { 
     return -1; 
    } else { 
     return 0; 
    } 
} 

void bubble_sort_string(char *string) { 
    if (!string || !string[0] || !string[1]) { return; } 
    int i; 
    int tail = 0; 
    char tmp; 
    while (string[tail]) { tail++; } 
    while (tail) { 
     i = 1; 
     while (i <= tail) { 
      if (custom_compare(&string[i-1], &string[i]) > 0) { 
       // swap 
       tmp = string[i]; 
       string[i] = string[i-1]; 
       string[i-1] = tmp; 
      } 
      i++; 
     } 
     tail--; 
    } 
} 

int main() { 
    char string[33] = "00FFEE11DDCCBBAA9988776655443322"; 
    printf("old string: %s\n", string); 
    bubble_sort_string(string); 
    printf("new_string: %s\n", string); 
    return 0; 
} 

輸出:

$ ./csort 
old string: 00FFEE11DDCCBBAA9988776655443322 
new_string: 2233445566778899AABBCCDD11EEFF00 
$ 
相關問題