内部排序(一)直接插入法

#include<stdio.h>
#include<stdlib.h>

#define maxsize 8 
typedef struct{
	int r[maxsize+1];
	int len;
}sqlist;



//直接插入排序
void InsertSort(sqlist &st )
{
  int i,j,t;
  for(i=2;i<st.len;i++)
  { 
	 st.r[0] = st.r[i];
  
	 for(j=i-1;j>0 && st.r[0]<st.r[j] ;j--)   //直接算,每一个来,都比较
       st.r[j+1] = st.r[j];
       st.r[j+1] = st.r[0];
  }
    
}

void InsertSort1(sqlist &st )
{
  int i,j,t;
  for(i=2;i<st.len;i++)
  
	 if( st.r[i] < st.r[i-1] )
	 {		 
	   st.r[0] = st.r[i];
       for(j=i-1;j>0 && st.r[0]<st.r[j] ;j--)   //其实if已经比较过,因此这样写没有 2 的效率高
          st.r[j+1] = st.r[j];
       st.r[j+1] = st.r[0];
	 }
}

void InsertSort2(sqlist &st )

{
  int i,j,t;
  for(i=2;i<st.len;i++)
     if( st.r[i] < st.r[i-1] )
	 {		 
	   st.r[0] = st.r[i];
       st.r[i] = st.r[i-1];  
	   for(j=i-2;j>0 && st.r[0]<st.r[j] ;j--)   //此处是j=i-2,在上一行中已经比较过,故减少一次交换
          st.r[j+1] = st.r[j];
       st.r[j+1] = st.r[0];
	 }
}

int main()
{   sqlist st;
	int d[maxsize] = {49,38,65,97,76,13,27,49};
	for(int i=0;i<8;i++)
		st.r[i+1] = d[i];//将数组的第一项置为空
	st.len = maxsize+1;
	
	InsertSort2(st);
    for(int j=1;j<st.len;j++)
     printf("%d\n",st.r[j]);
	return 0;
}



不将数组的第一项置空,也可以写:

#include<stdio.h>
#include<stdlib.h>
#define len 12

void InsertSort(int d[])
{
  int i,j,t;
  for(i=1;i<len;i++)
    if( d[i] < d[i-1] )
	{ 
	  t = d[i];
	  d[i] = d[i-1];
      for(j = i-2; j>=0 && t < d[j];--j)
	     d[j+1] = d[j];
	  d[j+1] = t;
	}

}

void InsertSort1(int d[])//没有上一种写法效率高,因此即使后项比前项大,还要进行循环内的比较,
                         //而按照直接插入的思想,后项如果比前项大,那么可以直接放入数组中,
                         //不再进入循环比较
{ 
	int i,j,t;
	for(i=1;i<len;i++)
        {  
	  t = d[i];
	  for(j = i-1; j>=0 && t< d[j];--j)
          d[j+1] = d[j];
          d[j+1] = t;
	}
}

int main()
{  
	int d[len] = {49,38,65,97,76,13,27,49,85,11,23,47};
	
	InsertSort1(d);

    for(int k=0;k<len;k++)
     printf("%d\n",d[k]);
	return 0;
}






你可能感兴趣的:(内部排序(一)直接插入法)