时间复杂度:O(n^2)
在数组近乎有序的条件下的时间复杂度:近乎等于O(n)
要求:数组从小到大排序
原理:从左到右遍历整个数组,挨个将未排序元素从右到左与左边已经排好序的元素进行比较,直到找到第一个不大于它的元素时,将其插入作为该元素的后继;若遍历结束也找不到,其便是新的最小值,插入作为首元素。
简易版(比较,交换):
template<typename T>
void insertionSort(T arr[], int n){
// 寻找元素arr[i]合适的插入位置
for( int i = 1 ; i < n ; i ++ ) {
for( int j = i ; j > 0 ; j-- )
if( arr[j] < arr[j-1] )
swap( arr[j] , arr[j-1] );
else
break;
return;
}
template<typename T>
void InsertionSort(T arr[], int n){
// 寻找元素arr[i]合适的插入位置
for( int i = 1 ; i < n ; i ++ ) {
for( int j = i ; j > 0 && arr[j] < arr[j-1] ; j -- )
swap( arr[j] , arr[j-1] );
}
return;
}
优化方法:直接交换—>先赋值,最后进行交换
可优化原因:不再频繁使用交换函数,赋值比交换函数运行速度更快
在数组本身基本有序的条件下,插入排序效率非常高的原因:可以提前终止内层循环
template<typename T>
void insertionSort(T arr[], int n){
for( int i = 1 ; i < n ; i ++ ) {
T e = arr[i];
int j;
for (j = i; j > 0 && arr[j-1] > e; j--)
arr[j] = arr[j-1];
arr[j] = e;
}
}