網(wǎng)站首頁 編程語言 正文
一、算法原理
折半插入排序是插入排序方法中一種,相比較與直接插入排序算法,減少了排序過程中比較次數(shù),也是一種常用的排序算法。
折半插入排序算法基本原理是將折半查找方法與直接插入排序方法相結(jié)合,也就是在每一次插入新元素時,利用折半查找方法找到其待插入的位置。
下面Demo演示了折半插入排序的實現(xiàn)過程。
Demo:
假設(shè)有數(shù)組:
折半插入排序首先把第一個元素直接放到排好序的數(shù)組中,第二個元素可以使用直接插入排序法進行排序,從第三個元素開始進行插入排序。
第一趟排序:
第二趟排序:l =0表示左,h=1表示右,m=(l+h)/2=1表示中間,其位置如下表所示,元素arr[2]=3是待插入元素,首先將其緩存到t。
此時arr[m] < t,因此修改l為m+1=1,之后重新計算m=(l+h)/2=1
再次比較出現(xiàn)arr[m] > t,因此修改h為m-1=0,出現(xiàn)了h<l的情形,因此結(jié)束本趟的排序,記錄h的位置(h=0),然后把h+1位置的元素向后移動一位,將t的值插入到arr[h+1].
第三趟排序:將元素arr[3]緩存給t,然后重復(fù)第二趟排序的方法即可
第四趟排序和第五趟排序,同上述方法一樣,經(jīng)過五趟排序之后,就完成了對該數(shù)組的折半插入排序。
二、折半插入排序算之C程序及測試
1. 折半插入排序
//將數(shù)組arr按照折半插入排序算法進行排序
void BinInsertSort( int arr[], int n )
{
int i, j, lo, mid, hi, t;
//第二個元素做直接插入排序
if( arr[1] < arr[0] )
{
t = arr[0];
arr[0] = arr[1];
arr[1] = t;
}
//從第三個元素開始進行折半插入排序
for( i = 2; i < n; i++ )
{
t = arr[i];
lo = 0;
hi = i-1;
//折半查找插入位置
while( lo <= hi )
{
mid = int( (lo + hi) / 2 );
if( t < arr[mid] )
{
hi = mid - 1;
}
else if( t > arr[mid] )
{
lo = mid + 1;
}
else
{
hi = mid;
break;
}
}
//從hi+1位置到i-1,向后依次移動元素,空出hi+1位置存儲新插入的元素
for( j = i - 1; j >= hi + 1; j-- )
{
arr[j + 1]= arr[j];
}
arr[hi + 1] = t;
}
}
2.完整的代碼(僅供參考)
#include"stdio.h"
void BinInsertSort( int arr[], int n );
int main()
{
int arr[] = { 4, 1, 3, 5, 4, 2 };
int n = 6;
printf( " Initial Array : " );
for( int j = 0; j < n; j++ )
{
printf( "%5d", arr[j] );
}
printf( "\n" );
BinInsertSort( arr, n );
return 0;
}
//將數(shù)組arr按照折半插入排序算法進行排序
void BinInsertSort( int arr[], int n )
{
int i, j, lo, mid, hi, t;
//第二個元素做直接插入排序
if( arr[1] < arr[0] )
{
t = arr[0];
arr[0] = arr[1];
arr[1] = t;
}
printf( " No. 1 time sort: " );
for( j = 0; j < n; j++ )
{
printf( "%5d", arr[j] );
}
printf( "\n" );
//從第三個元素開始進行折半插入排序
for( i = 2; i < n; i++ )
{
t = arr[i];
lo = 0;
hi = i-1;
//折半查找插入位置
while( lo <= hi )
{
mid = int( (lo + hi) / 2 );
if( t < arr[mid] )
{
hi = mid - 1;
}
else if( t > arr[mid] )
{
lo = mid + 1;
}
else
{
hi = mid;
break;
}
}
//從hi+1位置到i-1,向后依次移動元素,空出hi+1位置存儲新插入的元素
for( j = i - 1; j >= hi + 1; j-- )
{
arr[j + 1]= arr[j];
}
arr[hi + 1] = t;
//向屏幕輸出每趟排序結(jié)果
printf( " No. %d time sort: ", i );
for( j = 0; j < n; j++ )
{
printf( "%5d", arr[j] );
}
printf( "\n" );
}
}
3.測試用例
測試一:
測試二(有相同數(shù)據(jù)):
原文鏈接:https://blog.csdn.net/sunnyoldman001/article/details/127032485
相關(guān)推薦
- 2022-05-29 Docker容器下運行Nginx并實現(xiàn)反向代理_docker
- 2022-04-27 jQuery實現(xiàn)消息滾動播放效果_jquery
- 2022-04-20 Android實現(xiàn)將View轉(zhuǎn)化為圖片并保存到本地_Android
- 2023-01-05 Kotlin注解與反射的定義及創(chuàng)建使用詳解_Android
- 2023-03-03 react?native圖片解析流程詳解_React
- 2022-05-28 python按列索引提取文件夾內(nèi)所有excel指定列匯總(示例代碼)_python
- 2023-04-04 C語言對于volatile與gcc優(yōu)化的探究_C 語言
- 2022-06-22 一文搞懂C++多態(tài)的用法_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支