標籤:style color 檔案 width io art
二分法插入排序
演算法思想簡單描寫敘述:
在插入第i個元素時,對前面的0~i-1元素進行折半,先跟他們
中間的那個元素比,假設小,則對前半再進行折半,否則對後半
進行折半,直到left>right,然後再把第i個元素前1位與目標位置之間
的全部元素後移,再把第i個元素放在目標位置上。
二分法沒有排序,僅僅有尋找。所以當找到要插入的位置時。移動必須從最後一個記錄開始,向後移動一位,再移動倒數第2位,直到要插入的位置的記錄移後一位。
二分插入排序是穩定的,平均時間O(n2)
void binsort(ref int[] data1)
1、二分法尋找插入位置
假設R[i]<R[m]成立,那右指標就要向左移動中間指標一位,否則,左指標要向左移動中間指標一位。重複尋找,直到左指標大於右指標時停止。
2、後移,有點迷惑,什麼時候須要後移呢?有哪些記錄須要移動呢?
儘管我們非常清楚的知道,我們須要後移那些排序碼大於R[i]的記錄,但難免會問自己這樣幾個問題。事實上它相當於須要移動從i-1到左指標的記錄。
3、插入
由1中得到的左指標事實上就是元素要插入的位置。
4、演算法
{
int left,right,num;
int middle,j;
for( int i = 1;i < data1.Length;i++)
{
// 準備
left = 0;
right = i-1;
num = data1[i];
// 二分法尋找插入位置
while( right >= left)
{
// 指向已排序好的中間位置
middle = ( left + right ) / 2;
if( num < data1[middle] )
// 插入的元素在右區間
right = middle-1;
else
// 插入的元素在左區間
left = middle+1;
}
// 後移排序碼大於R[i]的記錄
for( j = i-1;j >= left;j-- )
{
data1[j+1] = data1[j];
}
// 插入
data1[left] = num;
}
// 插入的元素在左區間
left = middle+1;
}
// 後移排序碼大於R[i]的記錄
for( j = i-1;j >= left;j-- )
{
data1[j+1] = data1[j];
}
// 插入
data1[left] = num;
}
/* 二分法插入排序的演算法來源程式*/
#include<stdio.h>
#define MAXNUM 100
typedef int KeyType;
typedef int DataType;
typedef struct {
KeyType key; /* 排序碼欄位 */
/*DataType info; 記錄的其他欄位 */
} RecordNode;
typedef struct {
int n; /* n為檔案裡的記錄個數,n<MAXNUM */
RecordNode record[MAXNUM];
} SortObject;
void binSort(SortObject * pvector) { /* 按遞增序進行二分法插入排序 */
int i, j, left, mid, right;
RecordNode temp;
RecordNode *data = pvector->record;
for( i = 1; i < pvector->n; i++ ) {
temp = data[i];
left = 0; right = i-1; /* 置已排序區間的下、上界初值 */
while (left <= right) {
mid = (left + right)/2; /* mid指向已排序區間的中間位置 */
if (temp.key < data[mid].key)
right = mid-1; /* 插入元素應在左子區間 */
else left = mid+1; /* 插入元素應在右子區間 */
}
for (j = i-1; j >= left; j--)
data[j+1] = data[j]; /* 將排序碼大於ki的記錄後移 */
if (left != i) data[left] = temp;
}
}
SortObject vector={10, 49,38,65,97,76,13,27,49,50,101};
int main(){
int i;
binSort(&vector);
for(i = 0; i < vector.n; i++)
printf("%d ", vector.record[i]);
getchar();
return 0;
}