排序(2)直接插入排序
一、前言
直接插入排序(Insertion Sort)是一种最简单的插入排序。下面主要以升序作为讨论。
二、算法思想
插入排序:每一趟将一个带排序的记录,按照其关键字的大小插入到有序队列的合适位置里,直到全部插入完成。
编程语言:
假设有一组无序序列R0,R1,…,RN-1。
(1)首先,假设序列中下标为0的元素为一个有序序列。
(2)然后,我们一次吧R1,R2,…,RN-1插入到这个有序序列中。所以,我们需要一个外部循环,从1循环至N-1。
(3插入过程。假设此时我们需要插入Ri,则插入R时,前i-1个数已经有序。
所以,我们需要将Ri和R0-Ri-1进行比较,确定插入到合适的位置。此时需要一个内部循环。若从后往前比较,即从下标i-1开始向0进行扫描。
其实整个过程就等于将比Ri大的数往后挪,腾出一个合适的位置将Ri插入。
时间复杂度:
O(n^2)。最好情况下,已经有序O(n),最坏情况下逆序O(n^2)
稳定性:
稳定
适用场合:
当数组已经基本有序时,使用插入排序能有效减少移动的次数,时间消耗最少。
三、代码
/*
排序(2)直接插入排序
Time:2018-02-19
Author:Stella Chen
Content:
A simple example about Insertion Sort
*/
#include<stdio.h>
#define N 10
void insert_sort(int ary[], int n) {
int temp;
//假设第1个元素有序,从第2个元素开始依次插入有序序列
for (int i = 1; i < n; i++)
{
printf("第%d趟排序:\n", i);
//取出第1个数和前i-1个数比较,插入合适位置
temp = ary[i];
//因为i-1个数都是有序的,只要当前比较的数比t大,就把这个数后移一位
int j = i - 1;
for (j; j >= 0 && ary[j]>temp; j--)
{
printf("排序中:");
ary[j + 1] = ary[j];
for (int i = 0; i < N; i++)
printf("%d ", ary[i]);
printf("\n");
}
ary[j + 1] = temp;
printf("第%d趟排序结束:\n", i);
for (int i = 0; i < N; i++)
printf("%d ", ary[i]);
printf("\n\n");
}
}
int main() {
int ary[10] = { 10,2,3,1,5,15,7,9,20,11 };
printf("The original sequence:\n");
for (int i = 0; i < N; i++)
printf("%d ", ary[i]);
printf("\n\n");
insert_sort(ary, N);
return 0;
}
执行结果如下: