基数排序
基数排序(Radix Sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,按每个位数分别比较。它是一种稳定的排序算法,时间复杂度为O(n * k),其中n是要排序的数字个数,k是数字的最大位数。
基数排序实现方法
基数排序的实现方法可以分为以下几个步骤:
- 取得数组中的最大数,并取得位数;
- arr为原始数组,从最低位开始取每个位组成radix数组;
- 对radix进行计数排序(利用计数排序适用于小范围数的特点);
- 将排序好的radix数组拷贝到arr数组中;
- 当最高位排序完成后,将arr数组拷贝到original数组中,以此类推,直到一位排序完成。
示例代码
// 基数排序,arr是数组,n是数组长度,maxDigit是数组中最大数的位数 void radixSort(int* arr, int n, int maxDigit) { int i, j; int radix = 1; // 代表位数对应的数:1,10,100... int* tmp = (int*)malloc(n*sizeof(int)); // 计数排序 for(i = 1; i <= maxDigit; i++) { int count[10] = {0}; // 存放各个桶的数据统计个数 // 统计每个桶中的记录数 for(j = 0; j < n; j++) { int subKey = (arr[j] / radix) % 10; count[subKey]++; } // count[i]表示第i个桶的右边界索引 for(j = 1; j < 10; j++) { count[j] = count[j - 1] + count[j]; } // 将数据依次装入桶中 // 这里要从右向左扫描,保证排序稳定性 for(j = n - 1; j >= 0; j--) { int subKey = (arr[j] / radix) % 10; tmp[--count[subKey]] = arr[j]; } // 将已分配好的桶中数据再倒出来,此时已是对应当前位数有序的表 for(j = 0; j < n; j++) { arr[j] = tmp[j]; } radix = radix * 10; } free(tmp); }
基数排序是一种非比较型整数排序算法,它是一种稳定的排序算法,时间复杂度为O(n * k),其实现方法可以分为取得数组中的最大数,并取得位数;arr为原始数组,从最低位开始取每个位组成radix数组;对radix进行计数排序;将排序好的radix数组拷贝到arr数组中;当最高位排序完成后,将arr数组拷贝到original数组中,以此类推,直到一位排序完成。