基数排序
桶式排序
在了解、实现基数排序前,先要了解桶式排序。个人理解概括如下:
若有一组待排序的数data,已知其范围从0~m。则可申请大小为m的数组,初始化元素为0,将待排序数依次扫描,并将其数对应下标的数组元素置1,最后扫描数组由小到大(或由大到小)输出元素值为1的下标。
从上面前导的桶式排序已经可以看出,基于桶式排序的基数排序,是以空间换时间的排序算法。其运行时间为O(P(N+B)),P为排序的趟数,N为被排序的元素的个数。为了实现时间短的排序,基数排序会申请n*x个的地址空间作为容器进行排序(n为数据基数,此处为十进制记,x为待排序数据个数),空间开销大。
基数排序个人概述如下:
设i为数位,i=0,即从个位起,根据待排序数的第i位进行排序进行桶式排序,并将排序后数重新写入待排序数。循环直到i>数据中的最高位。
//巧妙运用自增减可简化代码
个人代码如下(数组实现):
//开始肛吧 数组版基数排序 #include<stdlib.h> #include<stdio.h> #define DEBUG 1 #define Cardinal 10//以10为基数 #define MaxPower 10//待排序数中以10为底的最高幂 /*传入整数n及整数pos,传出n中第pos位的值*/ /*pos从第0位开始计*/ int numofposition(int n, int pos) { int pospower=1; for (int i = 0; i < pos; i++) pospower *= 10; return n / pospower % 10; } /*传入待排序数组 数组元素个数*/ void Cardinal_Sort(int array[], int totalnum) { int i; int *temp_array[Cardinal];//建立基数排序0-9的桶 for (i = 0; i < Cardinal; i++) { temp_array[i] = (int*)malloc(sizeof(int)*(totalnum + 1));//对每一个基数的桶申请数组个数+1的空间(建立动态二维数组) temp_array[i][0] = 0; } for (i = 0; i < MaxPower; i++) { /*对data的第i位数进行桶式排序*/ for (int m, j = 0; j < totalnum; j++) { int order; m=numofposition(array[j], i);//判断第i位上的数是多少 temp_array[m][0]++; order = temp_array[m][0]; temp_array[m][order] = array[j];//找到i位上数对应的桶,将data按该桶内数组的次序填入 #ifdef DEBUG // printf("桶式排序:%d \n", temp_array[m][order]); #endif // DEBUG } /*将排好的数从新读入data数组*/ for (int g=0, j = 0; j < Cardinal; j++) { for (int k = 1; k <= temp_array[j][0]; k++) { array[g++] = temp_array[j][k];//巧妙利用自增 #ifdef DEBUG printf("数据数:%d 填入数据: %d\n", temp_array[j][0], temp_array[j][k]); #endif // DEBUG } temp_array[j][0] = 0;//复位 } #ifdef DEBUG for (int i = 0; i < totalnum; i++) printf("%d\t", array[i]); printf("\n"); #endif // DEBUG } } int main() { int testarray[10] = { 531,310,72,373,15,546,385,856,187,147 }; int num = 10; int i; for (i = 0; i < num; i++) printf("%d\t", testarray[i]); printf("\n"); Cardinal_Sort(testarray, num); for (i = 0; i < num; i++) printf("%d\t", testarray[i]); system("pause"); return 0; }
看懂了下方链接的单链表实现方式,不依靠循环而是靠拼接表头表尾,学习了。关于指针的学习之路漫漫修远兮。
参考博客:
感谢这些博主,你们都是我踽踽独行学习编程路上的老师。从你们代码中受益匪浅。
基数排序的数组实现:https://blog.csdn.net/cjf_iceking/article/details/7943609
桶式排序的链表实现:https://blog.csdn.net/LG1259156776/article/details/48803043
基数排序的链表实现:https://blog.csdn.net/Shayabean_/article/details/44885917