排序算法 - 基数排序(C++)

来源:互联网 发布:美国网络战司令部 编辑:程序博客网 时间:2024/05/16 11:43
/* * Get the spcific digit of given number. * For example, number 234,  *the 0st digit is 4,  *the 1st digit is 3, * the 2nd digit is 2, *the 3th digit is 0. */int GetNDigit(int nNumber, int nIdx){for (int i = nIdx; i > 0; i--) {nNumber /= 10;}return nNumber % 10;}/* * Counting Sort the given array according to specific digit. * array: 待排序数组. * nLength: 待排序数组长度 * nIdxDigit: 排序要依据的位. 0为最低位,高位依次加1. * nK: *nIdxDigit位上可能出现的最大数字(对10进制数排序则nK=9). */void CountingSort_SpecificDigit(int array[], size_t nLength, int nIdxDigit, int nK=9){if (NULL == array || 0 == nLength || 0 == nK)return;int *digitNum = new int[nLength];memset(digitNum, 0, sizeof(int)*nLength);int *count = new int[nK+1];memset(count, 0, sizeof(int)*(nK+1));int *arrayResult = new int[nLength];memset(arrayResult, 0, sizeof(int)*nLength);// 数组digitNum[],保存每个元素指定位上的数字,作为排序依据for (int idx = 0; idx<nLength; idx++)digitNum[idx] = GetNDigit(array[idx], nIdxDigit);// 先计数,count[idx]为值等于idx的元素的个数for (int idx = 0; idx<nLength; idx++)count[digitNum[idx]]++;// 再累加,count[idx]为小于等于idx的元素的个数for (int idx = 1; idx<nK+1; idx++)count[idx] = count[idx] + count[idx-1];// 从后向前循环(保证排序稳定), 根据指定位的数字大小// 将array[idx]排在所有小于等于array[idx]的数(共count[digitNum[idx]]个)的后面for (int idx=nLength-1; idx>=0; idx--){arrayResult[count[digitNum[idx]]-1] = array[idx];count[digitNum[idx]]--;}// 把排序结果写回原数组memcpy(array, arrayResult, sizeof(int)*nLength);delete [] digitNum;delete [] count;delete [] arrayResult;}/* * 基数排序 * array: 待排序数组 * nLength: 待排序数组元素个数 * nDigit: 所有元素的最大位数 */void RadixSort(int array[], size_t nLength, int nDigit){// 从最低位到最高位,依次调用计数排序for (int idx=0; idx<=nDigit; idx++) {CountingSort_SpecificDigit(array, nLength, idx);}}

原创粉丝点击