#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 ;
}
第十章(2).折半插入排序
最新推荐文章于 2021-10-11 15:03:15 发布