基数排序(C语言版本)

xiaoxiao2021-02-28  112

基本思想:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

代码:

#include<stdio.h> #include<windows.h> int getWidth(int *a,int n) { int flag = a[0]; int i; for(i=1;i<n;i++) { if(flag<a[i]) flag = a[i]; } int time=0; while(flag>0) { flag = flag/10; time++; } return time; } /* *获取一个数第d位数的值,位数索引从0开始 */ int getValue(int value, int d) { for (;d > 0 && value > 0; d--) { value = value /10; } return value % 10; } //桶操作 void innerCountingSort(int a[], int n, int d) { int i,flag,j,k=0; int b[10]; for(i=0;i<10;i++) { b[i] = 0; } int **p = (int **)malloc(10*sizeof(int *)); for(i=0;i<10;i++) { p[i] = (int *)malloc(n*sizeof(int)); } for(i = 0; i < n; i++) { flag = getValue(a[i], d); p[flag][b[flag]++] = a[i]; } for(i=0;i<10;i++) { for(j=0;j<b[i];j++) { a[k++] = p[i][j]; } } for(i=0;i<10;i++) { free(p[i]); } free(p); } //基数排序函数 void radixSort(int a[], int n,int width) { int i; for (i = 0; i < width; i++) { innerCountingSort(a, n, i); } } int main() { int a[] = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51}; int n= 28; int i; for(i=0;i<n;i++) { printf("%d\t",a[i]); } printf("\n\n"); //确定数组中的最高位 int width; width = getWidth(a,n); radixSort(a,n,width); for(i=0;i<n;i++) { printf("%d\t",a[i]); } printf("\n"); system("pause"); return 0; }

转载请注明原文地址: https://www.6miu.com/read-84738.html

最新回复(0)