一、希尔排序
步长是关键,这里选择数组的二分之一,四分之一,八分之一,...,直到为1
代码(c):
void shellSort(int *array, int length){
if(array==NULL||length<1) return ;
int inc=length/2; //定义的初始步长
int tem; //临时存储被排序的数
int i;
int curr,icurr; //记录当前比较的数的下标
for(;inc>=1;inc/=2){ //步长从大到小,直至为1,
for(i=0;i<inc;i++){ //步长为多少,产生多少条待排序队列
curr=i+inc; //当前序列的第二个数的下标,第一个是i
while(curr<length){ //控制序列是否排序结束
icurr=curr; //记录当前排序数的下标
tem=array[curr];
while(((curr-inc)>=0)&&(array[curr-inc]>tem)){//使用插入排序
array[curr]=array[curr-inc];
curr-=inc;
}
array[curr]=tem;
curr=icurr+inc;
}
}
for(int ii=0;ii<length;ii++){
printf("%d ",array[ii]);
}
printf("\n");//输入每次的排序结果
}
}
二、基数排序
分别取个位,十位,...,直至最高位进行排序
代码:
bool oneSort(int *array, int length,int c){
int **tem=(int **)malloc(sizeof(int*)*10);//临时存储,按照对第c位的排序
int *count=(int*)malloc(sizeof(int)*10);
int i,j;
for(i=0;i<10;i++){//初始
tem[i]=(int*)malloc(sizeof(int)*length);
count[i]=0;
memset(tem[i],0,sizeof(int)*length);
}
int p,m;//p表示第c位的值,m表示对原始数据的处理
m=1;
bool flag=false;//表明第c位是否存在不为零的值,若存在,继续第c+1位,否则,排序结束。
for(i=0;i<c;i++){
m*=10;
}
for(i=0;i<length;i++){
p=(int)(array[i]/m)%10;
tem[p][count[p]++]=array[i];
if(p>0) flag=true;
}
int index=0;
for(i=0;i<10;i++){
for(j=0;j<count[i];j++){
array[index++]=tem[i][j];
}
}
for(i=0;i<10;i++){
free(tem[i]);
}
free(tem);
free(count);
return flag;
}
void radixSort(int *array ,int length){
if(array==NULL||length<1) return ;
int c=0;
int i;
while(oneSort(array,length,c)){//进行第c位排序后,若全部是0,则表明第c-1位是最高位;否则进行第c+1位排序
c++;
for(i=0;i<length;i++){
printf("%d ",array[i]);
}
printf("\n");
}
}
备注:由于用int变量(10的C次方)得到当前的位数,能排序的数大小不超过int能表示的数大小。