直接插入排序(Straight Insertion Sort)
直接插入排序的基本操作:将一个记录插入到已经排好序的有序表中,从而得到一个新的。记录数增1的有序表。
直接插入排序理解和实现起来都比较简单,又称为简单插入排序。
方法就是,将待排的序列(无序表)中的元素一个个抽出,再逐个插入到已经排好的序列中(有序表)。
C++代码实现如下:
#include <iostream>
using namespace std;
void InsertSort(int k[], int n)
{
int i, j, temp;
for (i = 1; i < n; i++)
{
if (k[i] < k[i - 1]) //判断是否需要将当前元素向前插入
{
temp = k[i];
for (j = i - 1; k[j] > temp; j--)
{
//将比当前元素大的全部后移,并为当前元素腾出插入位置
k[j + 1] = k[j];
}
k[j + 1] = temp;
}
}
}
int main(){
int i;
int a[10] = { 1, 0, 2, 3, 4, 5, 6, 7, 8, 9 };
//int a[10] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
cout << "排序前的数组是:";
for (i = 0; i < 10; i++)
{
cout << a[i];
}
cout << endl;
InsertSort(a, 10);
cout << "排序后的结果是:";
for (i = 0; i < 10; i++)
{
cout << a[i];
}
cout << endl;
return 0;
}
代码实现结果:
直接插入排序算法的复杂度分析:
最好的情况下(序列本身有序):要做(n-1)次比较,移动的次数为0,时间复杂度为O(n)
最坏的情况下(序列本身逆序):要,2+3+4+...+n = (n+2)(n-1)/2次比较,移动的次数为3+4+5+...+(n+1) = (n+4)(n-1)/2,时间复杂度为O(n²)
随机排序,比较次数为n²/4,移动次数为n²/4,时间复杂度为O(n²)
所以,总的时间复杂度为O(n²)
同样的时间复杂度,直接插入排序比冒泡和简单选择排序的性能要好一些。