折半插入排序

#include <stdio.h>
#include <malloc.h>
typedef struct { int v ; } base_insert_node ;
typedef struct { base_insert_node * bins ; int len ; } base_insert_list;

void init( base_insert_list * , int * , int );
void print_base_insert_list( base_insert_list * );
void base_insert_sort( base_insert_list * );
void binary_insert_sort( base_insert_list * );

int main ()
{
 int arr[] = {6,7,9,10,67,34,21,55,12,4,7};
 int len = sizeof(arr)/sizeof(int);
 base_insert_list bil;
 init(&bil , arr , len);
 //base_insert_sort(&bil);
 binary_insert_sort(&bil);
 
 print_base_insert_list(&bil);
 getchar();
}

void init(base_insert_list *bil , int *arr , int len)
{
 bil->len = len;
 bil->bins = (base_insert_node *) malloc (len * sizeof(base_insert_node));
 int i ;
 for(i=0 ; i<len ; i++)
  (bil->bins + i)->v = *(arr+i);
}

void print_base_insert_list( base_insert_list *bil )
{
 int i = 0 ;
 for(i=0 ; i<bil->len ; i++)
  printf("%2d - " , (bil->bins + i)->v );
 printf("\n");
}

void base_insert_sort( base_insert_list *bil )
{
 int i ;
 int j ; 
 for ( i=1 ; i < bil->len ; i++ )
 {
  for (j = 0 ; j < i ; j++)
  {
   if( (bil->bins + i)->v <= (bil->bins + j)->v )
   {
    base_insert_node tmp_bin = *(bil->bins + i);
    int k ;
    for ( k = i-1 ; k >= j ; k-- )
     *(bil->bins + k + 1) = *(bil->bins + k);
    *(bil->bins + j)  = tmp_bin;
   }
  }
 }
}

void binary_insert_sort( base_insert_list *bil )
{
 int i ;
 int k ;
 for ( i = 1 ; i < bil->len ; i++ )
 {
  int low = 0 ;
  int high = i - 1 ;
  int mid = (low + high )/2;
  
  while( low != mid )
  {
   if( (bil->bins + mid )->v < (bil->bins + i)->v )
    low  = mid;
   else
    high = mid;
   mid = (low + high )/2;
  }
  if((bil->bins + i - 1 )->v > (bil->bins + i)->v && (bil->bins + i)->v > (bil->bins + mid)->v){ 
    base_insert_node tmp_bin = *(bil->bins + i);
     for ( k = i-1 ; k >= mid+1 ; k-- )
      *(bil->bins + k + 1) = *(bil->bins + k);
     *(bil->bins + mid + 1 )  = tmp_bin;
   }		
  else if((bil->bins + mid )->v > (bil->bins + i)->v){ 
    base_insert_node tmp_bin = *(bil->bins + i);
     for ( k = i-1 ; k >= mid; k-- )
      *(bil->bins + k + 1) = *(bil->bins + k);
     *(bil->bins + mid )  = tmp_bin;
   }		
 }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值