一、什麼是插入類排序?
插入類排序默認有一個已經排好序的序列,而後面的操作就是將未排好序的元素有序插入到已排好序的序列中。
將所有未排好序的元素插入到合適位置,即可得到一個有序序列。
二、需要了解的幾類插入類排序算法。
(1)、直接插入排序
直接插入排序是一種基本的插入排序算法。算法思路很簡單!以升序爲例:
<1>、 將序列的第一個元素看成一個有序序列(任何一個單元素都可以看成有序序列)。
<2>、 從第二個元素開始向後遍歷。 將第二個元素插入到第一個元素的前面(如果比第一個元素小),否則位置不變。
<3>、 然後繼續看第三個元素,此時前兩個元素是按升序有序的。將第三個元素按順序和第二個元素、第一個元素進行比較,將其放入合適的位置。
<4>、 直到最後一個元素也被放入前面的有序序列的合適位置,那麼排序完成。
過程如下圖 :
直接插入排序源代碼 :
/*
**功能: 直接插入法升序排序一個序列
**參數說明:
**@record : 序列數組 @len : 序列長度
**返回值: 無
*/
void InsertSort(int record[], int len)
{
int i, j;
int value; //存儲待插入元素值
//從第二個元素開始插入排序,第一個元素默認是有序的
for (i = 1; i < len;i++)
{
value = record[i];
//尋找合適的插入位置
j = i - 1;
while (j >= 0 && record[j] >= value)
{
record[j + 1] = record[j];
j--;
}
//將待排元素插入到合適的位置
record[j + 1] = value;
}
}
(2)、折半插入排序
折半插入與直接插入很像!唯一的區別在於它尋找插入位置的方法不同,直接插入是對有序表進行順序遍歷查找,而折半插入中的“折半”就體現在此處,它尋找插入位置是進行折半查找。大大增加了查找效率,但未改變移動元素的時間耗費。
折半插入排序源代碼:
void BinSort(int record[], int len)
{
int i, j;
int value; //存儲待插入元素值
int low, high, mid; //用於折半查找的變量
//從第二個元素開始插入排序,第一個元素默認是有序的
for (i = 1; i < len;i++)
{
value = record[i];
//折半法尋找插入位置
low = 0;
high = i - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (value < record[mid])
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
//移動元素,爲放置待排元素騰位置
for (j = i - 1; j >= low;j--)
{
record[j + 1] = record[j];
}
//將待排元素插入到合適的位置
record[low] = value;
}
}
int main(void) { int record[] = { 48,62,35,77,55,14,35,98 }; int len = sizeof(record) / sizeof(record[0]); int i = 0; printf("排序前: \n"); for (i = 0;i < len;i++) { printf("%d ", record[i]); } puts(""); BinSort(record, len); printf("排序後: \n"); for (i = 0;i < len;i++) { printf("%d ", record[i]); } puts(""); return 0; }
(3)、希爾排序(放在下一篇講解)