5分鐘了解折半插入排序

2021-09-24 23:29:35 字數 1267 閱讀 8903

5分鐘了解折半插入排序

前言折半插入排序(binary insertion sort)是對直接插入排序演算法的一種改進。

插入排序思想介紹

折半插入排序與直接插入排序演算法原理相同。只是,在向已排序的資料中插入資料時,採用來折半查詢(二分查詢)。先取已經排序的序列的中間元素,與待插入的資料進行比較,如果中間元素的值大於待插入的資料,那麼待插入的資料屬於陣列的前半部分,否則屬於後半部分。依次類推,不斷縮小範圍,確定要插入的位置。

演算法說明:

待排序資料:2,1,6,7,4

取第乙個元素作為有序表,剩餘的元素作為無序表

其中有序表:2;無序表:1,6,7,4

第一次比較,從無序表中取出第乙個數 1,與中間值2比較,1<2,1插到2的前面,得到

有序表:1,2;無序表:6,7,4

第二次比較,從無序表中取出第乙個數 6,與中間值1比較,6>1,要放在1的後面,再與後半區(有序表:2)的中間值2比較,6>2,6插入到2的後面,得到

有序表:1,2,6;無序表:7,4

第三次比較,從無序表中取出第乙個數 7,與中間值2比較,7>2,7放在2後面,再與後半區(有序表:6)的中間值6比較,7>6,7放在6後面,得到

有序表:1,2,6,7;無序表:4

第四次比較,從無序表中取出第乙個數 4,與中間值2比較,4>2,4放在2後面,再與後半區(有序表:6,7)的中間值6比較,4<6,4放在6前面,最終得到:

1,2,4,6,7

折半插入排序的**實現

private void binaryinsertsort(int arr){

int low = 0;

int high = 0;

int m = 0;// 中間位置

for(int i = 1; i < arr.length; i++){

low = 0;

high = i-1;

while(low <= high){

m = (low+high)/2;

if(arr[m] > arr[i])

high = m - 1;

else

low = m + 1;

//統一移動元素,將待排序元素插入到指定位置

temp = arr[i];

for(int j=i; j > high+1; j--){

arr[j] = arr[j-1];

arr[high+1] = temp;

總結折半插入排序相對穩定,相對於直接插入排序,減少了比較次數;但是相對直接插入排序,移動次數不變。

3 分鐘學會插入排序

思路 將待排元素插入到有序陣列中的合適位置,後邊的元素依次向後移動 將陣列分為有序與待排兩個區域 待排區從 1 開始,依次取出每個元素插入有序區,一共進行 n 1 趟 從有序區後面開始比較,有序元素 待排元素,有序元素則向後移動 實現public class solution else j 1 時,...

5分鐘了解docker

一 概念 開源的應用容器引擎,打包開發者的應用及依賴包在乙個可移植的容器中,相當於沙箱。docker允許開發人員在單個作業系統上隔離和執行多個應用程式,而不是為伺服器上的每個應用程式專用乙個虛擬機器。這是通過將應用程式隔離在單獨的容器中來實現的,這些應用程式雖然被容器分隔開,但是卻可以共享作業系統和...

插入排序 折半插入排序

折半插入排序 binary insertion sort 直接插入排序採用順序查詢法查詢當前記錄在已排好序的序列中插入位置,這個 查詢 操作可利用 折半查詢 來實 現,由此進行的插入排序稱之為折半插入排序 binary insertion sort 演算法思想 1 將待排序的記錄存放在陣列r 1.n...