C语言实现折半插入排序
一、动态数组实现即输即排
1.定义动态数组
#define InitSize 25
typedef struct {
int * data;
int MaxSize;
int length;
} DSqList;
2.初始化动态数组
void InitList ( DSqList & L) {
L. data = ( int * ) malloc ( InitSize * sizeof ( int ) ) ;
L. length = 0 ;
L. MaxSize = InitSize;
}
3.增加动态数组长度
void IncreaseSize ( DSqList & L, int len) {
int * p = L. data;
L. data = ( int * ) malloc ( ( L. MaxSize + len) * sizeof ( int ) ) ;
for ( int i = 0 ; i < L. length; ++ i) {
L. data[ i] = p[ i] ;
}
L. MaxSize + = len;
free ( p) ;
}
4.排序算法
bool InsertAndSort ( DSqList & L, int e) {
if ( L. length >= L. MaxSize)
{
printf ( "数组已满,插入失败,请增加长度后再插入!" ) ;
return false;
} else if ( L. length == 0 ) {
L. data[ 0 ] = e;
L. length++ ;
return true;
} else {
int i, low, high, mid;
low = 0 ;
high = L. length - 1 ;
while ( low <= high) {
mid = ( low + high) / 2 ;
if ( L. data[ mid] > e)
high = mid - 1 ;
else
low = mid + 1 ;
}
for ( i = L. length - 1 ; i >= high + 1 ; -- i)
L. data[ i + 1 ] = L. data[ i] ;
L. data[ high + 1 ] = e;
L. length++ ;
return true;
}
}
5.实时输入数值并排序
void CreateList ( DSqList & L) {
int e;
scanf ( "%d" , & e) ;
getchar ( ) ;
while ( e != - 1 ) {
InsertAndSort ( L, e) ;
printf ( "请继续输入下一个待插入值(如果结束请输入-1):" ) ;
scanf ( "%d" , & e) ;
getchar ( ) ;
}
}
二、不带哨兵的数组折半插入排序
void InsertSort_N ( int arr[ ] , int len) {
int i, j, temp, low, high, mid;
for ( i = 1 ; i < len; ++ i) {
temp = arr[ i] ;
low = 0 ;
high = i - 1 ;
while ( low <= high) {
mid = ( low + high) / 2 ;
if ( arr[ mid] > temp)
high = mid - 1 ;
else
low = mid + 1 ;
}
for ( j = i - 1 ; j >= high + 1 ; -- j)
arr[ j + 1 ] = arr[ j] ;
arr[ high + 1 ] = temp;
}
三、带哨兵的数组折半插入排序
void InsertSort_Y ( int arr[ ] , int len) {
int i, j, low, high, mid;
for ( i = 2 ; i < len; ++ i) {
arr[ 0 ] = arr[ i] ;
low = 1 ;
high = i - 1 ;
while ( low <= high) {
mid = ( low + high) / 2 ;
if ( arr[ mid] > arr[ 0 ] )
high = mid - 1 ;
else
low = mid + 1 ;
}
for ( j = i - 1 ; j >= high + 1 ; -- j)
arr[ j + 1 ] = arr[ j] ;
arr[ high + 1 ] = arr[ 0 ] ;
}
}
项目完整代码
#include <stdio.h>
#include <stdlib.h>
#define InitSize 25
typedef struct {
int * data;
int MaxSize;
int length;
} DSqList;
void InitDSqList ( DSqList & L) {
L. data = ( int * ) malloc ( InitSize * sizeof ( int ) ) ;
L. length = 0 ;
L. MaxSize = InitSize;
}
void IncreasrSize ( DSqList & L, int len) {
int * p = L. data;
L. data = ( int * ) malloc ( ( L. MaxSize + len) * sizeof ( int ) ) ;
for ( int i = 0 ; i < L. length; ++ i) {
L. data[ i] = p[ i] ;
}
L. MaxSize + = len;
free ( p) ;
}
bool InsertAndSort ( DSqList & L, int e) {
if ( L. length >= L. MaxSize)
{
printf ( "数组已满,插入失败,请增加长度后再插入!" ) ;
return false;
} else if ( L. length == 0 ) {
L. data[ 0 ] = e;
L. length++ ;
return true;
} else {
int i, low, high, mid;
low = 0 ;
high = L. length - 1 ;
while ( low <= high) {
mid = ( low + high) / 2 ;
if ( L. data[ mid] > e)
high = mid - 1 ;
else
low = mid + 1 ;
}
for ( i = L. length - 1 ; i >= high + 1 ; -- i)
L. data[ i + 1 ] = L. data[ i] ;
L. data[ high + 1 ] = e;
L. length++ ;
return true;
}
}
void CreateList ( DSqList & L) {
int e;
scanf ( "%d" , & e) ;
getchar ( ) ;
while ( e != - 1 ) {
InsertAndSort ( L, e) ;
printf ( "请继续输入下一个待插入值(如果结束请输入-1):" ) ;
scanf ( "%d" , & e) ;
getchar ( ) ;
}
}
void InsertSort_N ( int arr[ ] , int len) {
int i, j, temp, low, high, mid;
for ( i = 1 ; i < len; ++ i) {
temp = arr[ i] ;
low = 0 ;
high = i - 1 ;
while ( low <= high) {
mid = ( low + high) / 2 ;
if ( arr[ mid] > temp)
high = mid - 1 ;
else
low = mid + 1 ;
}
for ( j = i - 1 ; j >= high + 1 ; -- j)
arr[ j + 1 ] = arr[ j] ;
arr[ high + 1 ] = temp;
}
}
void InsertSort_Y ( int arr[ ] , int len) {
int i, j, low, high, mid;
for ( i = 2 ; i < len; ++ i) {
arr[ 0 ] = arr[ i] ;
low = 1 ;
high = i - 1 ;
while ( low <= high) {
mid = ( low + high) / 2 ;
if ( arr[ mid] > arr[ 0 ] )
high = mid - 1 ;
else
low = mid + 1 ;
}
for ( j = i - 1 ; j >= high + 1 ; -- j)
arr[ j + 1 ] = arr[ j] ;
arr[ high + 1 ] = arr[ 0 ] ;
}
}
int main ( ) {
DSqList L;
InitDSqList ( L) ;
printf ( "请继续输入第一个待插入值(如果结束请输入-1):" ) ;
CreateList ( L) ;
printf ( " 根据输入的值进行折半插入排序结果为:" ) ;
for ( int i = 0 ; i < L. length; ++ i) {
printf ( "%d " , L. data[ i] ) ;
}
printf ( "\n" ) ;
int arr_n[ ] = { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 } ;
int len = sizeof ( arr_n) / sizeof ( int ) ;
InsertSort_N ( arr_n, len) ;
printf ( "不带哨兵的数组进行折半插入排序结果为:" ) ;
for ( int i = 0 ; i < len; ++ i) {
printf ( "%d " , arr_n[ i] ) ;
}
printf ( "\n" ) ;
int arr_y[ ] = { 0 , 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 } ;
len = sizeof ( arr_y) / sizeof ( int ) ;
InsertSort_Y ( arr_y, len) ;
printf ( " 带哨兵的数组进行折半插入排序结果为:" ) ;
for ( int i = 1 ; i < len; ++ i) {
printf ( "%d " , arr_y[ i] ) ;
}
return 0 ;
运行效果图
int arr_n[ ] = { 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 } ;
int arr_y[ ] = { 0 , 49 , 38 , 65 , 97 , 76 , 13 , 27 , 49 } ;