-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),所以訂單以此方式維護。
在此先感謝你們。
我目前正在實現一種邏輯來排序順序中的字母數字上述{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),所以訂單以此方式維護。
在此先感謝你們。
你應該寫一個函數(例如,int custom_compare(const void *p1, const void *p2);
定義此排序順序,這個方法會返回1
如果p1
來p2
後,0
如果他們是「平等」,並-1
如果p1
來p2
之前。
然後,編寫你的排序方法,並調用你的排序函數,而不是比較使用運算符。也就是,而不是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
$
如果你表明你試圖解決的社會將更好地應對。如果您這樣做,我會更新我的答案,爲您提供更全面的答案。 –
通過「字母數字」,你是什麼意思?你想要分類什麼類型? –
@KyleStrand:當我更新我的描述時,我正在對FM RDS工作站的PI代碼中的第一個半字節進行排序。它的範圍從0到F,但是排序順序的期望輸出是{2,3 .... 9,A,B,C,D,1,E,F,0} – Siva