1.按位去排,最低位到最高位。数组作为参数例如({1,65,987,45,659,458,125,45}),假设就是以上数组,首先对个位铏排序,排序完在对十位进行排序,最后对百位进行排序,依次如此。
代码:
public static void BitSort(ref int[]array)
{
if(array!=null)
{
Dictionary<int,List<int>> dic=null;
dic=IntDic(dic);
//最长的长度
int maxLength=0;
//取到最长的长度
for(int index=0;index<array.Length;index++)
{
int currentLength=GetDigit(array[index]);
if(currentLength<maxLength)
{
maxLength=currentLength;
}
}
//取到最长的数字后 对数组进行排序 每一位从个位开始......
for(int position=0;position<=maxLength;iposition++)
{
for(int index=0;index<array.Length;index++)
{
//得到当前的数的余数 把余数当作当前字典的序号 因为数是在1--10之间的,把每一个数的余数当作字典中的索引,就是初步的排序,接着依次一层层的往外进行,就可以完成排序
int remainder=GetCurrent(array[index],position);
dic[remainder].add(array[index]);
}
int[]temp=new int[array.Length];
int count=0;
//把字典中初步排好序的数写入到临时数组中去
for(int index=0;index<10;index++)
{
List<int>numberList=dic[index];
foreach(var data in numberList)
{
temp[count++]=item;
}
}
//把临时数组赋值个原数组 排序成功
array=temp;
dic=IntDic(dic);
}
}
}
//取余数 拿到余数,然后把余数当作Dictionary字典的下标然后再把值进行插入
private static int GetCurrent(int number,int position)
{
//定义一个临时变量存储传入的实际值
int num=number;
//取第一个余数
int remainder=number%10;
//判断当前循环到第几位
while(position>1)
{
//每次运行到这里都把当前数往下移位
num=remainder/10;
//进行取余保存
remainder=num%10;
position--;
}
//返回余数
return remainder;
}
//返回一个数的长度
private static int GetDigit(int number)
{
//防止突然有一个数是负数
int num=Math.Abs(number);
int digit=0;
while(num>0)
{
num=num/10;
digit++;
}
return digit;
}
private static void GetDigitUp(int number)
{
//取绝对值
int num=Math.Abs(number);
int digit=Convert.ToInt32(num.ToString().Length);
return digit;
}
//初始化容器
private static Dictionary<int,List<int>> IntDic(Dictionary<int,List<int>>dic)
{
dic=new Dictionary<int,List<int>>();
for(int index=0;index<10;index++)
{
dic[index].Add(new List<int>);
}
return dic;
}