內部排序(3)——插入排序之折半插入排序
阿新 • • 發佈:2017-05-14
復雜 span oid pre 時間 查找 insert -1 順序
因為插入排序的基本思想是在一個有序序列中插入一個新的記錄,則能夠利用"折半查找"查詢插入位置,由此得到的插入排序算法為"折半插入排序"。算法例如以下:
void BInsertSort () { // 對順序表L作折半插入排序 for ( i=2; i<length; ++i ) { <span style="white-space:pre"> </span>r[0] = r[i]; // 將r[i]暫存到r[0] <span style="white-space:pre"> </span>low = 1; high = i-1; <span style="white-space:pre"> </span>while (low<=high) <span style="white-space:pre"> </span>{ // 在r[low..high]中折半查找有序插入的位置 <span style="white-space:pre"> </span>m = (low+high)/2; // 折半 <span style="white-space:pre"> </span>if (r[0]< r[m])
<span style="white-space:pre"> </span> high = m-1; // 插入點在低半區 <span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span> low = m+1; // 插入點在高半區 <span style="white-space:pre"> </span>} // while <span style="white-space:pre"> </span>for ( j=i-1; j>=low; --j ) <span style="white-space:pre"> </span> r[j+1] = r[j]; // 記錄後移 r[high+1] = r[0]; // 插入 } } // BInsertSort
可是。折半插入排序僅僅能降低排序過程中keyword比較的時間,並不能降低記錄移動的時間,因此折半插入排序的時間復雜度仍為O (n2)。
內部排序(3)——插入排序之折半插入排序