1.後插(從後往前插入)
思路:數組有N個元素,第i次循環後,前面i+1個元素排成升序,,現在要將第i+2個元素插入,具體做法:找到能插入的位置,在從後往前挨個找的過程中,把每一個比要插入的元素大的元素往後移一位,最後把值插入。
void back_insert(int a[], int n)
{
for (int i = 1; i < n; i++)
{
int p = a[i];
int j = i - 1;
while (p < a[j] && j >= 0)
{
a[j + 1] = a[j];//比a[i]大的a[j]後移
j--;
}
a[j + 1] = p;//插入
}
}
2.前插(從前往後插入)
思路:數組有N個元素,第i次循環後,前面i+1個元素排成升序,,現在要將第i+2個元素插入,具體做法:先找到要插入的位置,然後把該位置後面的元素從後往前依次後移一位,最後插入。
void front_insert(int a[], int n)
{
for (int i = 1; i < n; i++)
{
int p = a[i];
int j = 0;
while (p>a[j] && j < i)
{
j++;
}
for (int k = i; k > j; k--)
{
a[k] = a[k - 1];
}
a[j] = p;
}
}
最壞情況:第j趟操作,需要和之前的j個元素比較,並做出j+2次移動,所以總比較次數爲n(n-1)/2,總移動次數爲n(n-1)/2p
所以,插入排序時間複雜度爲O(n2),是個穩定的排序方法。