核心思想是按位排序(低位到高位)。適用于定長的整數或字符串,如例如:手機號、身份證號排序。按數據的每一位從低位到高位(或相反)依次排序,每次排序使用穩定的算法(如計數排序)。
#include <stdlib.h>
// 獲取數組中最大值(用于確定位數)
int getMax(int arr[], int n) {int max = arr[0];for (int i = 1; i < n; i++) {if (arr[i] > max) {max = arr[i];}}return max;
}// 使用計數排序對指定位數進行排序(exp=1,10,100...)
void countSort(int arr[], int n, int exp) {int* output = (int*)malloc(n * sizeof(int)); // 輸出數組int count[10] = {0}; // 十進制計數數組// 統計當前位數字出現次數for (int i = 0; i < n; i++) {count[(arr[i] / exp) % 10]++;}// 計算累計位置(穩定排序關鍵)for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 反向填充保證穩定性(相同數字保持原順序)for (int i = n - 1; i >= 0; i--) {output[count[(arr[i] / exp) % 10] - 1] = arr[i];count[(arr[i] / exp) % 10]--;}// 將排序結果復制回原數組for (int i = 0; i < n; i++) {arr[i] = output[i];}free(output);
}// 基數排序主函數(LSD:最低位優先)
void radixSort(int arr[], int n) {int max = getMax(arr, n);// 按每一位進行計數排序for (int exp = 1; max / exp > 0; exp *= 10) {countSort(arr, n, exp);}
}
#include <stdio.h>
// 打印數組
void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {170, 45, 75, 90, 802, 24, 2, 66}; // 測試數據int n = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");printArray(arr, n);radixSort(arr, n);printf("排序后: ");printArray(arr, n);return 0;
}
優化建議:
1.基數選擇優化,使用更大的基數(如256),減少迭代次數,提升緩存利用率
2.內存預分配,預分配輸出數組空間,減少多次內存分配開銷
3負數處理,分離符號位單獨處理,支持負數排序
擴展優化示例(支持負數)
void radixSortWithNegative(int arr[], int n) {// 分離正負數int* positive = malloc(n * sizeof(int));int* negative = malloc(n * sizeof(int));int pos_count = 0, neg_count = 0;for (int i = 0; i < n; i++) {if (arr[i] >= 0) {positive[pos_count++] = arr[i];} else {negative[neg_count++] = -arr[i]; // 取絕對值處理}}// 分別排序正負數radixSort(positive, pos_count);radixSort(negative, neg_count);// 合并結果(負數逆序)int index = 0;for (int i = neg_count - 1; i >= 0; i--) {arr[index++] = -negative[i];}for (int i = 0; i < pos_count; i++) {arr[index++] = positive[i];}free(positive);free(negative);
}
?