-
概念
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动
插入排序的工作方式就像是打扑克牌一样,从牌堆中抽出牌,然后插入左手的合适位置,如果是不排直接抽完所有的牌的话,那就把牌往右边挪一挪,把左边空出一点位置,把牌按顺序插入到左边去,直到这手牌有序。
-
步骤
- 从一个无序的列表中遍历去一个数据,插入到一个有序的列表中。这样说大概是有点难理解,那如果只有一个无序的列表怎么办。我们可以从一个无序列表的第二个数据也就是索引为1开始遍历,索引为0的数据就可以看做是一个只有一个数据的有序列表,因为它只有一个数据,所以它是有序的,这样就比较好理解了吧。
- 把遍历出的数据插入到有序列表中,怎么插入?首先得遍历这个有序列表,把要插入的数据和遍历出的数据进行比较,大就放该遍历的数据后面,小就放前面,怎么放?这也是个问题。假设有一个无序列表,已经是要插入第三个数据了(索引为2,i=2),所以前面两个数据就都是有序的,假设当前的无序列表是{1,5,3…},要插入的数据的前一个就是有序列表的最后一个元素,这个时候记录当前插入的值,从当前值往前遍历(j=i=2),如果索引i的值小于索引j-1的值,就让索引j-1的值赋给索引j的值(5是大于3的,[j-1]=[j]),反之当前位置就是要插入的位置。这个时候的无序列表为{1,5,5…},然后循环继续(j=1),这个时候(1<3),就把记录的要插入的值赋给当前位置的值,无序列表为{1,3,5…},重复上述操作,直到循环结束。
-
代码实现
void insertion_sort(int arr[], int len){ int i,j,temp; for (i=1;i<len;i++){ temp = arr[i]; for (j=i;j>0 && arr[j‐1]>temp;j‐‐) { arr[j] = arr[j‐1]; } arr[j] = temp; } }