typedef unsigned int Uint; // =================================================================== // 计数排序 // k: a中最大元素值+1 // 对每一个输入元素x,确定出小于x的元素个数.则x的位置在元素个数+1处 // 注意,排序后的数组b中,b[0]为空元素,实际排序好的数从b[1]开始 // =================================================================== void counting_sort(Uint *a,Uint *b,Uint k,Uint length) { Uint i,j; Uint *p = (Uint *)malloc(k * sizeof(Uint)); for(i = 0; i < k; i++) *(p + i) = 0; // 数组清0 for(j = 0; j < length; j++) { *(p + *(a + j)) += 1; } for(i = 1; i < k; i++) { *(p + i) = *(p + i) + *(p+i-1); } for(j = length -1; j != ~0; j--) // 从大到小,可保持稳定性 { *(b+ *(p + *(a + j))) = *(a + j); *(p + *(a + j)) -= 1; } free(p); } // =================================================================== // 为基数排序准备的计数排序 // a:原数组 b: 基数组 k:b中元素最大值+1 length:a,b的长度 // 注意,排好序的数组从result[1]开始 // =================================================================== void counting_sort_for_RS(int *a, int *b,int k,int length) { int i; int *pCount = (int *)malloc(k * sizeof(int)); // 计数数组 int *result = (int *)malloc((length + 1) * sizeof(int)); // 排序结果临时存储 // clear pCount for(i = 0; i < k; i++) pCount[i] = 0; // count the number of pCount for(i = 0; i < length; i++) { pCount[b[i]]++; } // 确定不大于该位置的个数 for(i = 1; i < k; i++) pCount[i] += pCount[i - 1]; // 排序 for(i = length -1; i >= 0; i--) { result[pCount[b[i]]] = a[i]; pCount[b[i]]--; } // 回写到a中 for(i = 1; i <= length; i++) a[i - 1] = result[i]; free(pCount); } // =================================================================== // 基数排序 // =================================================================== void radix_sort(int *a,int length) { int *pData = (int *)malloc(sizeof(int)*length); // 保存基数 int BaseNumber = 1; bool rsIsOk = 0; while(!rsIsOk) { rsIsOk = 1; // 初始设置为已完成,若取基数的时候取到有不为0的数,则修改为未完成 BaseNumber *= 10; for(int i = 0; i < length; i++) { pData[i] = a[i] % BaseNumber; pData[i] = pData[i] / (BaseNumber / 10); if(pData[i] > 0) rsIsOk = 0; // 未完成 } if(rsIsOk) break; counting_sort_for_RS(a,pData,10,length); } free(pdata); }