一次代码
#include <stdio.h>
void binaryInsert_sort ( int * arr, int n)
{
int i, j, get, left, mid, right;
for ( i = 1 ; i < n; i++ )
{
printf ( "i = %d\n" , i) ;
get = arr[ i] ;
printf ( "get = %d\n" , get) ;
left = 0 ;
right = i - 1 ;
while ( left <= right)
{
printf ( "外层right = %d\n" , right) ;
mid = ( left + right) >> 1 ;
printf ( "此时left=%d, right=%d,中值mid =(left + right) >> 1= %d\n" , left, right, mid) ;
if ( arr[ mid] < get)
{
printf ( " arr[mid]=%d < get=%d\n" , arr[ mid] , get) ;
left = mid + 1 ;
printf ( " 里层left = %d\n" , left) ;
}
else
{
printf ( " arr[mid]=%d > get=%d\n" , arr[ mid] , get) ;
right = mid - 1 ;
printf ( " 里层right = %d\n" , right) ;
}
}
for ( j = i - 1 ; j >= left; j-- )
{
arr[ j + 1 ] = arr[ j] ;
printf ( " j = %d\n" , j) ;
printf ( "arr[j+1] = %d\n" , arr[ j] ) ;
}
arr[ left] = get;
puts ( "循环结束后:" ) ;
printf ( " [此时的left] = %d\n" , left) ;
printf ( " 插入位置的值arr[left] = %d\n" , arr[ left] ) ;
putchar ( '\n' ) ;
}
}
void print ( int * arr, int n)
{
int i;
for ( i = 0 ; i < n; i++ )
{
printf ( "%d " , arr[ i] ) ;
}
printf ( "\n" ) ;
}
int main ( int argc, char const * argv[ ] )
{
int arr[ 6 ] = { 20 , 30 , 40 , 10 , 60 , 50 } ;
int n = sizeof ( arr) / sizeof ( int ) ;
binaryInsert_sort ( arr, n) ;
print ( arr, n) ;
return 0 ;
}
相关链接
https://blog.csdn.net/weixin_42826139/article/details/87891852?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
二次代码:添加了中间值左移、右移的打印
#include <stdio.h>
void binaryInsert_sort ( int * arr, int n)
{
int i, j, get, left, mid, right;
for ( i = 1 ; i < n; i++ )
{
printf ( "i = %d\n" , i) ;
get = arr[ i] ;
printf ( "get = %d\n" , get) ;
left = 0 ;
right = i - 1 ;
while ( left <= right)
{
printf ( "外层right = %d\n" , right) ;
putchar ( '\n' ) ;
mid = ( left + right) >> 1 ;
printf ( "此时left=%d, right=%d,中值mid =(left + right) >> 1= %d\n" , left, right, mid) ;
if ( arr[ mid] < get)
{
printf ( " arr[mid]=%d < get=%d\n" , arr[ mid] , get) ;
left = mid + 1 ;
printf ( " 里层left = %d\n" , left) ;
puts ( "中间值--左移" ) ;
putchar ( '\n' ) ;
}
else
{
printf ( " arr[mid]=%d > get=%d\n" , arr[ mid] , get) ;
right = mid - 1 ;
printf ( " 里层right = %d\n" , right) ;
puts ( "中间值--右移" ) ;
putchar ( '\n' ) ;
}
}
for ( j = i - 1 ; j >= left; j-- )
{
arr[ j + 1 ] = arr[ j] ;
printf ( " j = %d\n" , j) ;
printf ( "arr[j+1] = %d\n" , arr[ j] ) ;
}
arr[ left] = get;
puts ( "循环结束后:" ) ;
printf ( " [此时的left] = %d\n" , left) ;
printf ( " 插入位置的值arr[left] = %d\n" , arr[ left] ) ;
putchar ( '\n' ) ;
printf ( "-------------------------------------------" ) ;
putchar ( '\n' ) ;
}
}
void print ( int * arr, int n)
{
int i;
for ( i = 0 ; i < n; i++ )
{
printf ( "%d " , arr[ i] ) ;
}
printf ( "\n" ) ;
}
int main ( int argc, char const * argv[ ] )
{
int arr[ 6 ] = { 20 , 30 , 40 , 10 , 60 , 50 } ;
int n = sizeof ( arr) / sizeof ( int ) ;
binaryInsert_sort ( arr, n) ;
print ( arr, n) ;
return 0 ;
}
三次代码:加深了对mid +1\mid - 1的理解
* * 加深了左、右边界的理解
以及对中间值mid的理解* *
#include <stdio.h>
void binaryInsert_sort ( int * arr, int n)
{
int i, j, get, left, mid, right;
for ( i = 1 ; i < n; i++ )
{
printf ( "i = %d\n" , i) ;
get = arr[ i] ;
printf ( "get = %d\n" , get) ;
left = 0 ;
right = i - 1 ;
while ( left <= right)
{
printf ( "外层right = %d\n" , right) ;
putchar ( '\n' ) ;
mid = ( left + right) >> 1 ;
printf ( "此时left=%d, right=%d,中间值下标 mid =(left + right) >> 1= %d\n" , left, right, mid) ;
if ( arr[ mid] < get)
{
printf ( " arr[mid]=%d < get=%d\n" , arr[ mid] , get) ;
left = mid + 1 ;
printf ( " 里层-新的左边界left = %d\n" , left) ;
puts ( "中间值右侧会插入get值--中间值会左侧移动" ) ;
putchar ( '\n' ) ;
}
else
{
printf ( " arr[mid]=%d > get=%d\n" , arr[ mid] , get) ;
right = mid - 1 ;
printf ( " 里层-右边界right = %d\n" , right) ;
puts ( "中间值左侧会插入get值,中间值会--右侧移动" ) ;
putchar ( '\n' ) ;
}
}
for ( j = i - 1 ; j >= left; j-- )
{
arr[ j + 1 ] = arr[ j] ;
printf ( " j = %d\n" , j) ;
printf ( "arr[j+1] = %d\n" , arr[ j] ) ;
}
arr[ left] = get;
puts ( "循环结束后:" ) ;
printf ( " [此时的left] = %d\n" , left) ;
printf ( " 插入位置的值arr[left] = %d\n" , arr[ left] ) ;
putchar ( '\n' ) ;
printf ( "-------------------------------------------" ) ;
putchar ( '\n' ) ;
}
}
void print ( int * arr, int n)
{
int i;
for ( i = 0 ; i < n; i++ )
{
printf ( "%d " , arr[ i] ) ;
}
printf ( "\n" ) ;
}
int main ( int argc, char const * argv[ ] )
{
int arr[ 6 ] = { 20 , 30 , 40 , 10 , 60 , 50 } ;
int n = sizeof ( arr) / sizeof ( int ) ;
binaryInsert_sort ( arr, n) ;
print ( arr, n) ;
return 0 ;
}
i = 3时候的验算分析,就打印信息一起分析更佳