日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基数字符串排序c语言,基数排序(C语言)

發布時間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基数字符串排序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语言)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。