这是我第一次自己实现基数排序,我看了网上好多讲基数排序的都讲得乱起八糟,有的甚至给出来的代码还是错的。(附:我这个只当是一个启发式的代码。觉得博主有错的我请大家提出来,一起进步。感谢!!)
废话不多说,基数排序的定义自己百度。
我先来说说思路,基数排序是基于桶排序的一种线性排序方法,极其高效,如果一个需要排序的数组中最大元素小于1000大于100的话那么只需要执行两趟排序。
因为他是按照个、十、百位这样依次来进行排序的。先从最低位开始一直排到最高位!
高效是这个算法的优点,但是占用的空间之多又是这个算法的不足之处!
我下面的这段代码克服了负数进行排序的问题,我看了网上许多人的代码对负数的排序是不支持的。我对负数进行排序的主要思路是这样:
设置长度为20的第一维
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
分别对应-9,-8,-7,……,9;
这个类似于数轴,那么我们就抛弃了0这个位置。因为没有必要。10的这个位置就已经代表0
主要思路是这样,还是那句话源代码之中毫无秘密!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//2015年05月12日 01:35:35 测试成功!
#define Test 0
#define Test_1 0
#define Test_2 0
#define Test_3 0
#define Test_4 1
#if(Test_1 || Test_2 || Test_3)
#define Max 10
#else
#define Max 30
#endif
void
Print(int *a,char ch)
{
int i;
switch(ch)
{
case 'F':printf("_____排序前的数组内容______\n");
break;
case 'A':printf("_____排序后的数组内容______\n");
break;
}
for(i = 0; i < Max; i++)
printf("%d ",a[i]);
printf("\n");
return ;
}
void
Radix_swap(int *a,int len,int count)
{
int Radix[20][100] = {{0},{0}};
int i,j,value = 1;
int counter = 0;
int state = -1,k;
for(i = 0;i < count; i++)
{
for(j = 0;j < len; )
{
if( 0 == Radix[(a[j]/value) % 10 + 10 ][counter] )
{
#if Test
printf(" 第一个为空Radix[(a[%d]/value) % 10][%d] = %d,a[%d] = %d\n"
,(a[j]/value) % 10 + 10,counter,Radix[(a[j]/value) % 10 + 10][counter],j,a[j]);
#endif
Radix[(a[j]/value) % 10 + 10][counter] = a[j++];
counter = 0;
}
else
counter++;
}
counter = 0;
for(j = 1,k = 0;counter < len && j < 20 && k < 100;) // 为了安全起见这里必须保证它不越界
{
state = -1;
if( Radix[j][k] != 0)
{
a[counter++] = Radix[j][k];
#if Test
printf("复制 a[%d] = %d,Radix[%d][%d] = %d\n",counter,a[counter],j,k,Radix[j][k]);
#endif
Radix[j][k++] = 0;
state = 1;
}
if( state == -1 && Radix[j][k] == 0 )
{
j++;
k = 0;
}
}
value *= 10;
counter=0;
}
}
int
main(void)
{
//设置要排序的数组
#if Test_1
int array[Max] = {66,45,17,10,83,49,94,69,74,6};
#endif
#if Test_2
int array[Max] = {66,45,17,10,-83,49,94,69,74,-6};
#endif
#if Test_3
int array[Max] = {-3,-1,-41,-21,-30,-24,-66,4,-20,-67};
#endif
#if Test_4
//30组数据
int array[Max] = {-3,-1,-41,-21,-30,-24,-66,4,-20,-67,66,45,17,10,-83,49,94,69,74,-6,66,45,17,10,83,49,94,69,74,6};
#endif
Print(array,'F');
Radix_swap(array,Max,2);
Print(array,'A');
return 0;
}