在介绍插入排序的思想之前,说一下插入排序的一个重要的优点:插入排序只有在需要排序时才会排序。该算法的时间复杂度为:O(n^2),接下来我们来了解一下该排序的思想。
(1)插入排序的思想
插入排序的思想就是:从数组的下标为0的元素出发,每次向后取一个元素,将该元素插入到前面已排好的子数组中,以排升序为例,将所要插入的元素插在左边小于该元素和右边大于该元素之间的位置,进而形成新的子数组,直到所有元素全插进来为止。为了更好的理解,我们来看下面的图片:
由以上图片中我们知道,原数组的顺序为:5 2 3 8 1。接下来进行分步操作。
第一步:取数组第0个元素5,对5进行排序,结果形成了新的子数组为:5;
第二步:取数组的第1个元素2,将2插入第一步所得的子数组中,发现2应该放在5的左边,将2插入5的左边后,结果形成了新的子数组为:2 5;
第三步:取数组的第2个元素3,将3插入第二步所得的子数组中,发现3应该放在2和5的中间,将3插入2和5的中间后,结果形成了新的子数组为:2 3 5;
第四步:取数组的第3个元素8,将8插入第三步所得的子数组中,发现8应该放在5的右边,将8插入5的右边后,结果形成了新的子数组为:2 3 5 8;
第五步:取数组的第4个元素1,将1插入第四步所得的子数组中,发现1应该放在2的左边,将1插入2的左边后,结果形成了新的子数组为:1 2 3 5 8;
最后,由于插入了所有的元素,故排序结束。
(2) 插入排序的实现
本次实现采用C++的模版编程来完成该排序算法。
#include <iostream>
#include <iterator>
using namespace std;
template<class T,size_t N>
void PrintArr(T (&arr)[N]) {
copy(arr,arr+N,ostream_iterator<T>(cout," "));
cout << endl;
}
template<class T,size_t N>
void InsertSort(T (&arr)[N]) {
for(size_t i=0,j; i<N; i++) {
T temp(arr[i]);
for(j=i; j>0 and temp < arr[j-1]; j--) {
arr[j] = arr[j-1];
}
arr[j] = temp;
}
}
template<class SortFunc>
void Test(SortFunc sort) {
int arr[] = {5,2,3,8,1};
cout << "InsertSort:"<<endl;
sort(arr);
PrintArr(arr);
}
int main(){
Test(InsertSort<int,5>);
}