牺牲空间换时间的非比较排序之计数排序和基数排的序

  

非比较排序试用于元素比较集中的序列。

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));   }   }

牺牲空间换时间的非比较排序之计数排序和基数排序

牺牲空间换时间的非比较排序之计数排序和基数排的序