实现思路
其实现思路重点在于“插入”二字,那么,是谁?又在哪里进行插入呢?实际上,从
i=0
开始遍历数组,以
i
为当前元素进行考察,在
前提:数组 [0,i−1] 已经排好序了,这也是其最大的特性,可以用来提前终止循环。
代码实现
1)使用swap函数
template<typename T>
void insertionSort(T arr[], int n){
for( int i = 1 ; i < n ; i ++ ) {
// 写法2
for( int j = i ; j > 0 && arr[j] < arr[j-1] ; j --)
swap( arr[j] , arr[j-1] );
}
return;
}
2)用拷贝的方式进行
template<typename T>
void insertionSort(T arr[], int n){
for( int i = 1 ; i < n ; i ++ ) {
// 写法3
T e = arr[i];
int j; // j保存元素e应该插入的位置
for (j = i; j > 0 && arr[j-1] > e; j--)
arr[j] = arr[j-1];
arr[j] = e;
}
return;
}
性质与特性
- 其前提数组 [0,i−1] 已经排好序了,这一点可以用来提前终止循环,加快排序效率。
- 在近乎有序的数组中用这种方法性能更加显著,可以将其作为高级排序算法快要排序完成的最后优化的那部分。