基数字符串排序c语言,基数排序(C语言)
基數排序是一種非比較型整數排序算法,其原理是將整數按位數切割成不同的數字,然后按每個位數分別比較。由于整數也可以表達字符串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用于整數
基數排序 vs 計數排序 vs 桶排序
這三種排序算法都利用了桶的概念,但對桶的使用方法上有明顯差異:
基數排序:根據元素的每位數字來分配桶;
計數排序:每個桶只存儲單一鍵值;
桶排序:每個桶存儲一定范圍的數值;
基數排序動圖演示
image
#include
#include
#include
#include
#include
//定義基數為10進制
#define radix 10
//交換數值
void swap(int *a,int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
//打印數組
void printArray(char msg[],int arr[],int len){
printf("%s:",msg);
for (int i = 0; i < len; i++){
printf("%d ", arr[i]);
}
printf("\n");
}
//基數排序
void radix_sort(int a[],int len){
int maxvalue=a[0],minvalue=a[0];
for(int x=0;x
maxvalue=a[x]>maxvalue?a[x]:maxvalue;
minvalue=a[x]
}
int* temp = (int*)malloc(len*sizeof(int));
//獲取最大位數
int n=1;
int d = maxvalue-minvalue;
while(d>=10){
d=d/10;
n++;
}
printf("總遍歷位數:%d,最小值:%d,最大值:%d\n",n,minvalue,maxvalue);
//要獲取的位
int divide=1;
for(int i=1;i<=n;i++){
//初始化計數器
int counter[radix]={0};
for(int j=0;j
//找出a[j]相對minvalue值的對應的位divide的值
int pos = ((a[j]-minvalue)/divide)%radix;
//a[j]換算成計數器數組下標pos并自增
counter[pos]++;
}
//使用累加(counter[n]=counter[n]+counter[n-1],有點類似斐波那契數列)計算出元素所在位置,保證結果有序
for(int j=1;j<10;j++){
counter[j]=counter[j]+counter[j-1];
}
//倒序遍歷數組a,可以保持結果穩定性
for(int j=len-1;j>=0;j--){
//將a[j]映射到計數器下標pos,counter[pos]就是a[j]在新數組的位置
int pos=((a[j]-minvalue)/divide)%radix;
//獲取元素位置mappos,--counter[pos]:每放一個元素到數組temp,counter[pos]值自減,保證結果穩定有序
int mappos=(--counter[pos]);
temp[mappos]=a[j];
}
//把temp有序數組賦值給a
for(int j=0;j
a[j]=temp[j];
}
printf("遍歷位數%d:\n",divide);
for(int j=0;j
printf("a[%d]=%d,a[%d]-%d=%d\n",j,a[j],j,minvalue,a[j]-minvalue);
}
printf("\n");
//獲取數值的下個位,比如個位數,下個是十位數
divide=divide*radix;
}
free(temp);
}
int main()
{
int len=10;
int arr[len];
srand((unsigned)time(NULL));
//隨機生成長度為"len"的數組
for(int i=0;i
arr[i]=rand()%200;
}
printArray("未排序前",arr,len);
radix_sort(arr,len);
printArray("基數排序",arr,len);
//防止windows下控制臺窗口閃退
int s;
scanf("%d",&s);
return 0;
}
運行結果:
未排序前:126 36 76 198 65 172 107 3 53 60
總遍歷位數:3,最小值:3,最大值:198
遍歷位數1:
a[0]=3,a[0]-3=0
a[1]=53,a[1]-3=50
a[2]=65,a[2]-3=62
a[3]=126,a[3]-3=123
a[4]=36,a[4]-3=33
a[5]=76,a[5]-3=73
a[6]=107,a[6]-3=104
a[7]=198,a[7]-3=195
a[8]=60,a[8]-3=57
a[9]=172,a[9]-3=169
遍歷位數10:
a[0]=3,a[0]-3=0
a[1]=107,a[1]-3=104
a[2]=126,a[2]-3=123
a[3]=36,a[3]-3=33
a[4]=53,a[4]-3=50
a[5]=60,a[5]-3=57
a[6]=65,a[6]-3=62
a[7]=172,a[7]-3=169
a[8]=76,a[8]-3=73
a[9]=198,a[9]-3=195
遍歷位數100:
a[0]=3,a[0]-3=0
a[1]=36,a[1]-3=33
a[2]=53,a[2]-3=50
a[3]=60,a[3]-3=57
a[4]=65,a[4]-3=62
a[5]=76,a[5]-3=73
a[6]=107,a[6]-3=104
a[7]=126,a[7]-3=123
a[8]=172,a[8]-3=169
a[9]=198,a[9]-3=195
基數排序:3 36 53 60 65 76 107 126 172 198
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的基数字符串排序c语言,基数排序(C语言)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux信号使用,linux信号使用注
- 下一篇: c语言定义函数insert,c语言编写函