插入排序基本思想:一个数组拥有n个数据,从第二个数据a[1]开始,与前面的数据a[0]比较,若a[1]<a[0],则a[1],a[0]互换位置,此时前两个数据为有序数据(由小到大);继续看第三个数据a[3],a[3]依次与前面的数据作比较,若a[3]<a[2],则二者互换位置,再与前一个数据比较,直到找到正确的位置。
需要进行(n-1)趟比较,第一趟进行一次比较,第n-1趟进行(n-1)次比较。
比较次数:(1+n-1)*(n-1)/2=n*(n-1)/2。需要一个辅助空间,用于交换数据。
平均情况的时间复杂度 最好情况的时间复杂度 最坏情况的时间复杂度 空间复杂度
O(n^2) O(n^2) O(n^2) O(1)
代码实现1:
#ifndef _INSERTSORT_H #define _INSERTSORT_H #include<iostream> using namespace std; template<class Type> void InsertSort(Type *a,int n) { Type tem; for(int i=1;i<n;i++) { tem=a[i]; while( i>0 && tem<a[i-1] ) { a[i]=a[i-1]; i--; } a[i]=tem; } } #endif
代码实现2:
template <typename Type> void InsertSort(Type a[],int n) { for(int i=1;i<n;i++) { Type tem=a[i]; int j; for(j=i-1;j>=0&&tem<a[j];j--) { a[j+1]=a[j]; } a[j+1]=tem; } }
因为待排序数据之前的数据为有序数据,故可以使用折半查找的方法找到数据的正确插入位置。
template<typename Type> void BinInsertSort(Type a[],int n) { for(int i=1;i<n;i++) { Type tem=a[i]; int low=0,mid; int high=i-1; while(low<=high) { mid=(low+high)/2; if(tem<a[mid]) high=mid-1; else low=mid+1; } for(int j=i-1;j>=low;j--) a[j+1]=a[j]; a[low]=tem; } }
测试代码:
#include<iostream> #include"InsertSort.h" using namespace std; int main() { int a[10]={18,23,15,3,8,54,12,54,76,100}; for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; InsertSort(a,10); for(int i=0;i<10;i++) cout<<a[i]<<" "; cout<<endl; return 0; }