希尔排序和基数排序的实现

一、希尔排序

        步长是关键,这里选择数组的二分之一,四分之一,八分之一,...,直到为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能表示的数大小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值