第十章(2).折半插入排序

#include <iostream>
using namespace std ;

#define  MAXSIZE  20     //存储元素的顺序表的最大长度
typedef  int   KeyType ;   //关键字类型
typedef  int   InfoType ;   //其他数据项类型

typedef  struct {
 KeyType key ;
 InfoType otherinfor ;     //其他数据项
} RedType ;

typedef  struct {
 RedType r[ MAXSIZE + 1 ] ;    //r[0]闲置或用作哨兵单元
 int  length ;      //顺序表长度
} SqList ;         //顺序表类型

void InPut( SqList &L )
{
 int value = 0 ;
 int i = 1 ;
 while( i < ( MAXSIZE + 1 ) )
 {
  cin >> value ;
  if( value == -1 )     //以-1为结束符
   break ;
  L.r[ i ++ ].key = value ;
 }
 L.length = i - 1 ;
}

void BinaryInsertSort( SqList &L )    //引用  排序顺序为从小到大
{
 int j = 0 ;
 int high = 0 , low = 0 , mid = 0 ;

 for( int i = 2 ; i < L.length + 1 ; ++ i )
 {  
  L.r[ 0 ] = L.r[ i ] ;   //L[ 0 ] 暂时寄存要交换的数据
  low = 1 ;
  high = i - 1 ;
  while( low <= high )   //在r[low…high]中折半查找有序插入的位置
  { 
   mid = ( low + high ) / 2 ; //当high,low均为1的情况真的妙啊!
   if( L.r[ 0 ].key < L.r[ mid ].key )
    high = mid - 1 ;
   else
    low = mid + 1 ;
  }
  for( j = i - 1 ; j > high ; -- j )//将从high+1开始的记录后移
   L.r[ j + 1 ] = L.r[ j ] ; 
  L.r[ high + 1 ] = L.r[ 0 ] ; //插入到正确的位置  
 }
}

void OutPut( SqList L )
{
 for( int i = 1 ; i < L.length + 1 ; ++ i )
 {
  cout << L.r[ i ].key << ' ' ;
 }
 cout << endl ;
}

int main( )
{
 SqList L ;

 InPut( L ) ;
 BinaryInsertSort( L ) ;
 OutPut( L ) ;

 return 0 ;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值