插入排序 算法思路:和桥牌中类似,每次只考虑一张牌,将新来的牌插入已经排好序的牌中的适当的位置中。在计算机应用中,为了插入新数据,先将较大的数据项一个个向右移动,然后将新数据插入空位中。
和选择排序算法一样,排序过程中当前数据项的左边是排好的,不过它们不是处于最后的位置上,因为之后它们可能还需要进行移动来为更小的数据腾出空间。当索引移到最右边时,数组就完全排序好了。
一个高效的插入排序的实现:
#include <iostream> #include <stdlib.h> using namespace std; template <typename Item> void insertion(Item a[], int l, int r) { int i; for (i=l;i<=r;i++) { int j=i; Item v=a[i]; while (v<a[j-1]) { a[j]=a[j-1]; j--; } a[j]=v; } } void main() { int i; int N=10; int *a=new int[N]; int sw=1; if(sw) { for(i=0;i<N;i++) a[i]=1000*(1.0*rand()/RAND_MAX); } else { N=0; while(cin>>a[N]) N++; } for(i=0;i<N;i++) cout<<a[i]<<" "; cout<<endl; insertion(a,0,N-1); for(i=0;i<N;i++) cout<<a[i]<<" "; cout<<endl; }
实现的结果如下:
和选择排序不同的是,插入排序的运行时间和输入文件数据的原始排列顺序有很大关系。