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

来源:互联网 发布:千千秀字软件 编辑:程序博客网 时间:2024/06/05 10:59
#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 12void 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;}






原创粉丝点击