直接插入排序,指每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。具体方法是第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。它是由两层嵌套循环组成的,外层循环标识并决定待比较的数值,内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
简单来说,就是每次选择一个元素,将其放入有序序列中。(n-1)次操作之后,整个数组就已有序。
eg:
6 8 5 7 1 2 4 3
6|8 5 7 1 2 4 3
6 8|5 7 1 2 4 3
5 6 8|7 1 2 4 3
5 6 7 8|1 2 4 3
1 5 6 7 8|2 4 3
1 2 5 6 7 8|4 3
1 2 4 5 6 7 8|3
1 2 3 4 5 6 7 8
整个排序结束,看起来是【n-1】次操作,但是在每次插入的过程中需要从头重新遍历,实际上的应该是n*n级别的操作。
所以,直接插入排序是n*n级别时间复杂度的排序方法,隶属于插入排序,隶属于内部排序。
代码实现:
#include <stdio.h>
#include<iostream>
using namespace std;
void InsertSort(int R[], int n)
{
int i, j;
int temp;
for (i = 1; i < n; ++i)
{
temp = R[i];
j = i - 1;
while (j >= 0 && R[j] > temp)
{
R[j + 1] = R[j];
--j;
}
R[j + 1] = temp;
}
}
int main()
{
int a;
int b[7] = { 22,12,16,2,11,44,55 };
InsertSort(b, 7);
for (a = 0; a < 7; a++)
{
printf("%d\n", b[a]);
}
system("pause");
return 0;
}