1、為減少二分插入排序中的比較及移動次數,可考慮一次以兩個資料為單位進行插入。以公升序為例,每次插入時先找出兩個待插入資料中的較大者,按二分查詢法確定其位置,在向後移動已有序記錄時一次移動兩個位置(因為較小記錄肯定將來放在較大記錄之前);插入較大資料後再按傳統二分插入排序演算法在較大資料所處位置與第一條資料所處位置之間插入較小資料。
2、因為在插入較大資料時已經縮小了較小資料的查詢範圍,同時,在給較大記錄移出存放空間時已經提前將一部分本來應該在插入較小資料時才移動的記錄提前一趟進行了移動,從而既減少了確定較小記錄位置時的比較次數,又減少了移動次數,效能得到了改善。
3、演算法描述如下(記錄即資料):
假定r[1]到r[i-1]間的記錄已經是有序的,現要將從r[i]到最後的所有記錄再插入到有序序列中去,可按以下步驟進行:
(1)將 r[i]和 r[i+1]中較大記錄放入 max,較小記錄放入 min;
(2)用二分查詢法確定 max 在 r[1]到 r[i-1]這一段中應該所處的位置,用 high1 表示;
(3)將從 r[high1+1]到 r[i-1]這段中的記錄向後移動兩條記錄的位置;
(4)將 max 放入 r[high1+2];
(5)用二分查詢法確定 min 在 r[1]到 r[high1]這一段中應該所處的位置,用 high2 表示;
(6)將從 r[high2+1]到 r[high1]這段中的記錄向後移動一條記錄的位置;
(7)將 min 放入 r[high2+1];
(8)重複(1)至(8)的過程,直到所有記錄插入完為至。
下面是一些定義:
#include
#include
using
namespace
std;
//#define maxsize 50
const
unsigned
int
maxsize = 50;
// 最大長度
typedef
int
keytype;
// 關鍵字型別,假定為int
typedef
double
infotype;
// 其它部分資料型別,此處假定為double
typedef
struct
redtype;
// 記錄型別
typedef
struct
sqlist;
// 順序表型別
另外,附上兩個函式,作用分別是用隨機數初始化順序表 和 顯示當前順序:
void
randominit(sqlist* l,
int
nmax
/*= null*/
)
else
l->r[i].otherinfo =
rand
();
}
}
void
printnoworder(sqlist* l)
cout << endl;
}
5、事實上,我需要多次使用上述內容,所以將上述內容封裝成乙個類了,此處就不提了,下面是二分雙插入排序的實現**:
// 二分雙插入排序演算法
void
binarydoubleinsertsort(sqlist *l)
else
nlow1 = 1;
nhigh1 = i - 1;
// 用二分法確定較大數的位置
while
(nlow1 <= nhigh1)
else
}
// 後移記錄,為待插入數提供位置,一次移兩個
for
(j = i - 1; j >= nhigh1 + 1; j--)
l->r[nhigh1 + 2] = nmax;
// 插入較大數
nlow2 = 1;
nhigh2 = nhigh1;
// 用二分法確定較小數插入位置,只在較大數字置及起始位置之間查詢即可
while
(nlow2 <= nhigh2)
else
}
for
(j = nhigh1;j >= nhigh2 + 1; j-- )
//後移記錄,為待插入數提供位置,一次移乙個
l->r[nhigh2 + 1] = nmin;
//插入較小數
}
}
插入排序 簡單插入排序 二分插入排序
1 假設我們手裡的數字是一堆亂序撲克牌,我們想把它整理成從小到大的排序,會怎麼辦呢,我們會從左往右挨個將牌抽出來插到它合適的位置,這樣一輪之後,就變成從小到大的順序了。2 程式上怎麼實現,從第二位開始,逐個將後乙個數和它之前所有的資料進行比較,尋找這個數最合適的插入位置,將其插入空隙,後面的值依次會...
排序演算法 插入排序 二分法插入排序
package 插入排序 二分法插入排序 按二分法找到合適位置插入 穩定 基本思想 二分法插入排序的思想和直接插入一樣,只是找合適的插入位置的方式不同,這裡是按二分法找到合適的位置,可以減少比較的次數。public class 二分法插入排序 system.out.println 排序前 for i...
二分查詢 快速排序演算法 插入排序
1 二分查詢 2 int half find int num,int size,inta 3 18return false 沒找到19 20 快速排序演算法 21 void quicksort char s,int low,int high 2234 35 swap s,last,low 基準元與界...