排序(二)

来源:互联网 发布:淘宝夜鹰 编辑:程序博客网 时间:2024/06/07 12:37
3.插入排序1)直插void InsertSort(){  int i,j;  for(i=1;i<n;i++)        //将后面元素依次向前比较插入     if(a[i].key>a[i-1].key){        a[0]=a[i];        for(j=i-1;a[0].key>a[j].key;j--)            a[j+1]=a[j];   //后移元素        a[j+1]=a[0];       //插入最终位置      }}时间复杂度O(n^2),空间复杂的O(1)简单直接,算法稳定2)折半插入void InsertSort(ElemType a[],int n){  int i,j,low,high,mid;  for(i=2;i<=n;i++){    a[0]=a[i];           //a[i]暂存到a[0]    low=1;high=i-1;    while(low<=high){      mid=(low+high)/2;      if(a[mid].key>a[0].key) high=mid-1;  //查找左半字表      else low=mid+1;    }    for(j=i-1;j>=high+1;j--)      a[j+1]=a[j];                 //统一后移    a[high+1]=a[0];  }}时间复杂度O(n^2),空间复杂度O(1)减少了比较次数为O(nlogn),算法稳定