網(wǎng)頁建設(shè)與網(wǎng)站設(shè)計心德體會多合一seo插件破解版
核心思想是按位排序(低位到高位)。適用于定長的整數(shù)或字符串,如例如:手機號、身份證號排序。按數(shù)據(jù)的每一位從低位到高位(或相反)依次排序,每次排序使用穩(wěn)定的算法(如計數(shù)排序)。
#include <stdlib.h>
// 獲取數(shù)組中最大值(用于確定位數(shù))
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;
}// 使用計數(shù)排序?qū)χ付ㄎ粩?shù)進行排序(exp=1,10,100...)
void countSort(int arr[], int n, int exp) {int* output = (int*)malloc(n * sizeof(int)); // 輸出數(shù)組int count[10] = {0}; // 十進制計數(shù)數(shù)組// 統(tǒng)計當前位數(shù)字出現(xiàn)次數(shù)for (int i = 0; i < n; i++) {count[(arr[i] / exp) % 10]++;}// 計算累計位置(穩(wěn)定排序關(guān)鍵)for (int i = 1; i < 10; i++) {count[i] += count[i - 1];}// 反向填充保證穩(wěn)定性(相同數(shù)字保持原順序)for (int i = n - 1; i >= 0; i--) {output[count[(arr[i] / exp) % 10] - 1] = arr[i];count[(arr[i] / exp) % 10]--;}// 將排序結(jié)果復制回原數(shù)組for (int i = 0; i < n; i++) {arr[i] = output[i];}free(output);
}// 基數(shù)排序主函數(shù)(LSD:最低位優(yōu)先)
void radixSort(int arr[], int n) {int max = getMax(arr, n);// 按每一位進行計數(shù)排序for (int exp = 1; max / exp > 0; exp *= 10) {countSort(arr, n, exp);}
}
#include <stdio.h>
// 打印數(shù)組
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}; // 測試數(shù)據(jù)int n = sizeof(arr) / sizeof(arr[0]);printf("排序前: ");printArray(arr, n);radixSort(arr, n);printf("排序后: ");printArray(arr, n);return 0;
}
優(yōu)化建議:
1.基數(shù)選擇優(yōu)化,使用更大的基數(shù)(如256),減少迭代次數(shù),提升緩存利用率
2.內(nèi)存預分配,預分配輸出數(shù)組空間,減少多次內(nèi)存分配開銷
3負數(shù)處理,分離符號位單獨處理,支持負數(shù)排序
擴展優(yōu)化示例(支持負數(shù))
void radixSortWithNegative(int arr[], int n) {// 分離正負數(shù)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]; // 取絕對值處理}}// 分別排序正負數(shù)radixSort(positive, pos_count);radixSort(negative, neg_count);// 合并結(jié)果(負數(shù)逆序)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);
}