插入排序分为直接插入排序和折半插入排序两种
设存在一个一维数组 array[0......n-1], 第 i 趟排序是将数组中下标为 i 的第 i + 1 个元素插入到一个已经按值有序排列的i个子序列的合适位置。
(1)第一个元素看成有序序列,从下标为 i = 1 的第二个元素开始,每一趟排序都将下标为 i 的元素插入到之前的有序序列中,然后 i = i + 1 进行下一个元素的插入排序,由此可见插入排序需要 n - 1 趟排序
(2)每次寻找插入元素 array[i] 的位置,是从有序序列的最后一个元素 array[i-1] 开始查找,直到找到某一位置的元素 array[j] (j >= 0 && j <= i-1)满足 array[j] <= array[i], 那么下标为j + 1 的位置就应该是插入元素 array[i]的合适位置。从有序序列的最后一个元素开始查找,边查找边移动元素,而不是先找到插入位置再移动元素,这样提高了效率。
(3)将array数组中下标 [j + 1,i - 1]的所有元素依次后移一位,空出 array[j+1]的位置。
1、直接插入排序
算法描述:设存在一个一维数组 array[0......n-1], 第 i 趟排序是将数组中下标为 i 的第 i + 1 个元素插入到一个已经按值有序排列的i个子序列的合适位置。
(1)第一个元素看成有序序列,从下标为 i = 1 的第二个元素开始,每一趟排序都将下标为 i 的元素插入到之前的有序序列中,然后 i = i + 1 进行下一个元素的插入排序,由此可见插入排序需要 n - 1 趟排序
(2)每次寻找插入元素 array[i] 的位置,是从有序序列的最后一个元素 array[i-1] 开始查找,直到找到某一位置的元素 array[j] (j >= 0 && j <= i-1)满足 array[j] <= array[i], 那么下标为j + 1 的位置就应该是插入元素 array[i]的合适位置。从有序序列的最后一个元素开始查找,边查找边移动元素,而不是先找到插入位置再移动元素,这样提高了效率。
(3)将array数组中下标 [j + 1,i - 1]的所有元素依次后移一位,空出 array[j+1]的位置。
(4)将array[i] 元素赋值给 array[j+1],至此完成插入排序的一趟排序。
例程:
#include <iostream>
using namespace std;
int simple_insert_sort(int ar