定义:
直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从 而得到一个新的、记录数量增1的有序表。
思想:
每次将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止;和大家平时玩扑克牌时整理牌的方法差不多,看后面的每张牌,将其插入到前面合适的位置,当整理完最后一张牌时,插入排序就完成了。例如:
将3和4移动到5的左侧,再将2移动到最左侧,顺序就算是理好了。这就是直接插入排序法。
排序示例:
假设数组有如下8个元素待排序:
1.首先第一个元素8不动,因为当我们只考虑8这个元素时,它就已经排好序了,如图:(蓝色表示已排好序,红色表示待排序元素)
2.看第二个元素6,我们要做的就是将6放到前面数组中合适的位置,显然,6比8要小,所以将6和8调换位置,这样前两个元素就排好序了,如图:
3.再看元素2,2比8小,调换位置,同时2比6小,再和6调换位置,最终2插入到了最前面,结果如图:
4.重复上述方法,将剩余元素调整到数组中合适的位置,最终排序结果如图:
代码实现:
#include<iostream>
using namespace std;
void insertionSort(int arr[], int n) {
for (int i = 1; i < n; i++) {
//寻找元素arr[i]合适的插入位置
for (int j = i; j > 0; j--) {
if (arr[j] < arr[j - 1])
swap(arr[j], arr[j - 1]);
else
break;
}
}
}
int main() {
int arr[8] = { 8,6,2,3,1,5,7,4 };
cout << "排序前数组:" << " ";
for (int i = 0; i < 8; i++)
cout << arr[i] << " ";
cout << endl;
insertionSort(arr, 8);
cout << "排序后数组:" << " ";
for (int i = 0; i < 8; i++)
cout << arr[i] << " ";
cout << endl;
system("pause");
return 0;
}
代码运行结果如图:
算法分析:
最好的情况,也就是要排序的数组本身就是有序的,比如数组是{1,2,3,4,5,6,7,8},只比较元素,没有移动次数,时间复杂度为O(n);
最坏的情况,即待排序的数组元素是逆序的情况,比如{8,7,6,5,4,3,2,1},此时需要比较 次,移动次数达到最大值:
综上,直接排序法的时间复杂度为O(n^2)