internalclassProgram { privatestaticvoidMain(string[] args) { int[] arr = { 121, 432, 564, 23, 1, 45, 788 }; Console.WriteLine("未排序前的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } Console.WriteLine(); radixSort(arr); Console.WriteLine("排序后的数组:"); for (int i = 0; i < arr.Length; i++) { Console.Write(arr[i] + " "); } }
privatestaticintgetMax(int[] arr) { int max = arr[0]; for (int i = 0; i < arr.Length; i++) { if (arr[i] > max) { max = arr[i]; } } return max; }
privatestaticvoidcountingSort(int[] arr, int place) { int length = arr.Length; int[] output = newint[length];
int max = (arr[0] / place) % 10; for (int i = 1; i < length; i++) { if (((arr[i] / place) % 10) > max) { max = (arr[i] / place) % 10; } }
int[] count = newint[max + 1]; for (int i = 0; i < length; i++) { count[(arr[i] / place) % 10]++; }
for (int i = 1; i < max + 1; i++) { count[i] += count[i - 1]; }
// 一定要从后往前排 for (int i = length - 1; i >= 0; i--) { output[count[(arr[i] / place) % 10] - 1] = arr[i]; count[(arr[i] / place) % 10]--; }
for (int i = 0; i < length; i++) { arr[i] = output[i]; } }
privatestaticvoidradixSort(int[] arr) { int max = getMax(arr); // 根据最高位数,从低位依次进行计数排序 for (int i = 1; max / i > 0; i *= 10) { countingSort(arr, i); } } }