基数排序

来源:互联网 发布:汽车钥匙套真皮 淘宝 编辑:程序博客网 时间:2024/06/13 22:53

一、基数排序

1、基数排序又叫桶排序,借助多关键字排序的思想对单逻辑关键字进行排序。

2、基本思想:

  (1)用0~9作为下标分别记录的个位、十位、百位...0~9的数字,首先对应个位将数据入桶。

  (2)保证先进先出将数据重新排列,然后相同的方法看十位数字将数据入桶。

  (3)重新排列,依次比较。

3、排列的趟数等于最大数的位数

4、代码如下:

#include<stdio.h>#include<math.h>#define N 14int FindMaxFinger(int arr[], int len){int max = arr[0];for (int i = 1; i < len; ++i){if (arr[i] > max){max = arr[i];}}int count = 0;while (max != 0){max = max / 10;count++;}return count;}//每个数据 位的数 (45 0) 5  (45 1) 4//num/pow(10.0,fin)%10int FindFingerNumber(int num, int fin){return num / (int)pow(10.0,fin) % 10;}//0 ,1,2(个,十,百) 0不能参与排序void Radix(int arr[], int len, int fin){int tmp[10][N] = {};int num_fin;int count;for (int i = 0; i < len; ++i){count = 0;num_fin = FindFingerNumber(arr[i], fin);while (tmp[num_fin][count] != 0){count++;}tmp[num_fin][count] = arr[i];}count = 0;for (int i = 0; i < 10; ++i){for (int j = 0; j < len; ++j){if (tmp[i][j] != 0){arr[count++] = tmp[i][j];}else{break;}}}}//0可以参与排序void Radix1(int arr[], int len, int fin){int tmp[10][N] = {};int num_fin;int count[10] = {};for (int i = 0; i < len; ++i){num_fin = FindFingerNumber(arr[i], fin);tmp[num_fin][count[num_fin]] = arr[i];count[num_fin]++;}int index = 0;for (int i = 0; i < 10; ++i){for (int j = 0; j < count[i]; ++j){arr[index++] = tmp[i][j];}}}//每趟循环调用Radix()void RadixSort(int arr[], int len){int maxFinNum = FindMaxFinger(arr, len);for (int i = 0; i < maxFinNum; ++i){Radix1(arr, len, i);}}int main(){int arr[N] = { -1,0,45, 5, 4, 12, 4, 156, 456, 465, 4, 12, 16, 6 };int len = N;RadixSort(arr,len);return 0;}

原创粉丝点击