算法和数据结构排序插入排序

直接插入排序

int insertsort(int x[],int n)
{
	int i,j,t;
	for(i=0;i<n;i++)
	{
		t=x[i];
		for(j=i;j>=0&&x[j-1]>t;j--)
		{
			x[j]=x[j-1];
		}
		x[j]=t;
	}
}
 折半插入
void BiInsertionSort(SqList &L){
   //对顺序表L作折半插入排序
   for(i=2; i<=L.length; ++i){
      L.r[0] = L.r[i];
      low = 1;
      high = i-1;

        //查找i记录应该插入的位置,必定是high+1的位置从而high+1位置以后的元素都应该往后移动一个位置,留出一个位置放入L.r[i]
      while(low <= high){
         mid = (low + high)/2;
         if(LT(L.r[0], L.r[m].key))
            high = m - 1;
         else
            low = m + 1;
      }
      //后移
      for(j=i-1; j>=high+1; --j)
         L.r[j+1] = L.r[j];
      //插入元素
      L.r[high+1] = L.r[0];
   }
} 

 希尔排序

void ShellSort(SqList *L)
 {
     int i,j;
     int increment=L->length;
     do
     {
         increment=increment/3+1;            /* 增量序列 */
         for(i=increment+1;i<=L->length;i++)
         {
             if (L->r[i]<L->r[i-increment])    /* 需将L->r[i]插入有序增量子表 */ 
             { 
                 L->r[0]=L->r[i];             /* 暂存在L->r[0] */
                 for(j=i-increment;j>0 && L->r[0]<L->r[j];j-=increment)
                     L->r[j+increment]=L->r[j]; /* 记录后移,查找插入位置 */
                 L->r[j+increment]=L->r[0]; /* 插入 */
             }
         }
     }
     while(increment>1);
 }
原文地址:https://www.cnblogs.com/tgkx1054/p/2601845.html