确定一个数组,进行排序
首先把个位上的数字0-9进行计数,存入另一个计数数组当中(范围0-9),
然后进行累加,得到一个用于计数的数组,
然后根据计数的数量,反向遍历一遍原数组,把个位数从小到大先进行一次分配,从0到9,根据计数数组确定分配的范围。然后现在得到了一个新的个位数已经经过排序的数组
然后把这个数组作为新的数组进行一次新的循环重复上面的操作(注意本次循环是把十位的数字进行计数)
计数,累加,又会得到一个新的计数数组
再进行反向遍历然后把十位上的数字从0到9进行分配,得到一个新的数组
把这个十位排序完成的数组作为一个新的数组继续进行一个新的循环计数(注意本次循环是把百位上的数字进行计数)
然后进行累加得到一个新的计数数组
重复上面的操作,即可得到一个从小到大完全有序的数组,本次排序操作完成。
关键核心在于确定数组当中最大的数的位数,即可确定要进行几次循环操作,上述例子最大的数是三位数所以一共要进行三次计数累加操作,要进行两次循环的重复操作。
上面这段代码是用来确定一个数组当中元素的最大长度。
这段代码是关键也是最核心的,只要确定了循环的操作,后续只是简单的反复套用。
首先我们一共需要三个数组,一个起始数组(startarr)和一个目标数组(endarr)用来存放排序前后的两个数组,还有一个是用来计数累加的计数数组(countarr)。
其次我们要搞清楚循环的原理。当我们遍历一个数组的某个位上的数字时,一定是0-9的,而恰好计数数组也只是需要0-9的,并且每当找到一个数就在原始条件上加一,刚好是countarr的第几个数就加一(比如需要计数0,每找到一次0就加一个1,那就是countarr[0]+1)每个数字的原理都是一样所以我们这里直接用countarr[startarr[i]%10] += 1;
下面那个循环就是用来累加了,为了最后得到一个累加过后的计数数组方便分配空间。
最后一个循环体是用来根据计数数组分配的空间来进行一个排序,得到一个某个位上经过排序的数组
最后就是简单的进行反复调用了。根据自己判断出来的最大的元素的位数来确定一共要进行几次循环然后就反复调用就可以了。