非比较排序试用于元素比较集中的序列。
1,计数排序
- <李>
找出待排序的数组中最大和最小的元素
李> <李>统计数组中每个值为 我的元素出现的次数,存入数组C 的第我项
李> <李>对所有的计数累加(从C 中的第一个元素开始,每一项和前一项相加)
李> <李>反向填充目标数组:将每个元素 放我在新数组的第 C (i) 项,每放一个元素就将 C (i) 减去1
李>void CountSort (int *, int 大小) { assert (); int max =, [0]; int min =, [0]; for (int 小姐:=,1;,小姐:& lt;,大小;,我+ +) { if (max & lt;,[我]) max =,(我); if (min 祝辞,[我]) min =,(我); } int CountSize =, max 作用;min +, 1;//该序列的范围在最小~最大之间,所以开辟不等式+ 1 int * CountArray =, new int [CountSize]; memset (CountArray 0 CountSize * sizeof (int)); for (int 小姐:=,0;,小姐:& lt;,大小;,我+ +) { CountArray[[我]分钟]+ +,//比如序列在万1到2万之间,那么1万应该存在下标为0的数组上 } int index =, 0; for (int 小姐:=,0;,小姐:& lt;=, CountSize;,我+ +) { int count =, CountArray[我]; while (计数——,祝辞,0) { (指数+ +),=,我+,最小;//那么此时下标为0的数,就万是1 } } }
2,基数排序
,基数排序指的是先把序列中的每个数中的个位排的序,然后十位排的序,直到超过序列中最大数的位数
void DigitSort (int *, int 大小) { assert (); int bit =, 1,, sum =, 10; for (int 小姐:=,0;,小姐:& lt;,大小;,我+ +) { while ([我],祝辞=,总和),,,//取最大数的位数 { 位+ +; *=sum 10; } } int digit =, 1; int * bucket =, new int(大小); 时间=while (digit & lt;位) { int 数[10],=,{,0}; int 位置[10],=,{,0}; for (int 小姐:=,0;,小姐:& lt;,大小;,我+ +) { int numbit =,战俘(10,数字1); int bitvalue =,([我],/,numbit), %, 10; 数[bitvalue] + +;,, } for (int 小姐:=,1;,小姐:& lt;, 10;,我+ +) { 位置[我],=,位置(小姐,安康;1),+,计数(小姐,安康;1); } for (int 小姐:=,0;,小姐:& lt;,大小;,我+ +) { int numbit =,战俘(10,digit 作用;1); int bitvalue =,([我],/,numbit), %, 10; 桶(位置[bitvalue] + +),=,(我); } 数字+ +,,,,,,, memcpy(桶,大小* sizeof (int)); } }