回 帖 发 新 帖 刷新版面

主题:排序算法合集(如有别的,欢迎大家完善)

void   insertsort(int   a[],int   n)           //简单插入排序   
  {   
          int   i,j,k,t;   
          for(i=1;i<n;i++)   
          for(j=0;j<i;j++)   
          if(a[j]>a[i])   
          {   
                  t=a[i];   
                  for(k=i;k>j;k--)   a[k]=a[k-1];   
                  a[j]=t;   
                  break;   
          }   
  }   
    
  void   InsertSort(int   a[],int   n)           //折半插入排序   
  {   
          int   i,j,temp,low,high,m;   
  for(i=1;i<n;i++)   
  {   
          temp=a[i];   
          low=0;high=i-1;   
          while(low<=high)   
          {   
                  m=(low+high)/2;   
                  if(temp<a[m])   high=m-1;   
                  else   low=m+1;   
          }   
          for(j=i-1;j>=low;j--)   a[j+1]=a[j];   
          a[low]=temp;   
  }   
  }   
    
  typedef   struct{     //表插入排序(不需要移动元素   )   
          int   a;   
          int   next;               //指针,指向比a大一点的数   
    }slnode;   
    
  void   arrange(slnode   r[],int   n)   
  {   
          int   i,p,q;   
          slnode   t;   
          p=r[0].next;   
          for(i=1;i<n;i++)   
          {   
                while(p<i)   p=r[p].next;   
          q=r[p].next;                   //必须有   
          if(p!=i)   
          {   
                  t=r[p];r[p]=r[i];r[i]=t;   
                  r[i].next=p;   
          }   
          p=q;   
          }   
  }   
    

回复列表 (共22个回复)

沙发

void   listinsertsort(int   aa[],int   n)       //表插入排序(不需要移动元素   )   
  {   
          int   i;   
          int   j,j0;   
            const   int   maxint=20000;   
          slnode   r[n+1];   
    r[0].a=maxint;r[0].next=1;   
    r[1].next=0;   
    for(i=0;i<10;i++)   
    r[i+1].a=aa[i];   
    for(i=2;i<11;i++)   
    {   
          j=r[0].next;   
          j0=0;   
          while(r[i].a>r[j].a)   {j0=j;j=r[j].next;}   
          r[j0].next=i;   
          r[i].next=j;   
  }   
  arrange(r,n+1);   
  for(i=0;i<10;i++)   
    aa[i]=r[i+1].a;   
  }   
    
  void   shellinsert(int   a[],int   n,int   m)   
  {   
  //功能:以m为增量对a进行插入排序   
          int   i,j,t;   
          for(i=m;i<n;i++)   
          if(a[i]<a[i-m])   
          {   
                  t=a[i];   
                  for(j=i-m;j>=0&&t<a[j];j-=m)   
                  a[j+m]=a[j];   
                  a[j+m]=t;   
          }   
  }   
    
  void   shellsort(int   a[],int   n)               //shell排序(属于高效排序)   
  {   
          int   k=n;   
          k=(5*k-1)/11;                                   //取序列是a(n)=(5n-1)/11   
          while(k>=2)   
          {   
                  shellinsert(a,n,k);   
                  k=(5*k-1)/11;   
          }   
          shellinsert(a,n,1);   
  }   
    
    
  //起泡排序用的很少,此处省略   
    void   quicksort1(int   a[],int   m,int   n)     //快速排序(最简单的高效排序)   
    {   
          int   i,j;   
          int   temp;   
          if(m>=n)   return;   
          i=m;   
          j=n;   
          temp=a[i];                               //以a[m]为枢轴   
          while(i<j)   
          {   
                    while(temp<=a[j]&&i<j)   
                        j--;   
                a[i]=a[j];   
                  while(temp>=a[i]&&i<j)   
                        i++;   
                a[j]=a[i];   
            }   
          a[i]=temp;   
          quicksort1(a,m,i-1);   
          quicksort1(a,i+1,n);   
    }   
      

板凳

void   quicksort2(int   a[],int   m,int   n)   //快速排序(最简单的高效排序)   
    {   
          int   i,j,mid=(m+n)/2;   
          int   t,temp;   
          if(m>=n)   return;   
          i=m;   
          j=n;   
          temp=a[mid];   
              while(temp>=a[i]&&i<mid)   
                        i++;   
            if(i<mid)           a[mid]=a[i];         //以a[mid]为枢轴(也可以选取a[m],a[mid],   
                                                                    //a[n]中的中值,可以改进快速在最坏情况下的性能)   
          while(i<j)   
          {   
                    while(temp<=a[j]&&i<j)   
                        j--;   
                  a[i]=a[j];   
                  while(temp>=a[i]&&i<j)   
                        i++;   
                    a[j]=a[i];   
    
            }   
          a[i]=temp;   
          quicksort2(a,m,i-1);   
          quicksort2(a,i+1,n);   
    }   
    
  void   merge(int   a[],int   b[],int   i,int   m,int   n)   
  {   
  //函数功能:将有序列a[i,...,m]和a[m+1,....,n]归并为有序列b[i,...,n]   
          int   j,k,t;   
          for(j=m+1,k=i;i<=m&&j<=n;k++)   
          {   
                  if(a[i]>a[j])     b[k]=a[j++];   
                  else     b[k]=a[i++];   
          }   
          if(i<=m)   
          for(t=0;t<=m-i+1;t++)   
          b[k+t]=a[i+t];   
          if(j<=n)   
            for(t=0;t<=n-j+1;t++)   
          b[k+t]=a[j+t];   
  }   
    
  void   msort(int   a[],int   b[],int   s,int   t)           //2路   并归排序(用的不多)   
  {   
          int   m,c[t-s+1];   
      if(s==t)     b[s]=a[s];   
      else   
      {   
          m=(s+t)/2;   
          msort(a,c,s,m);   
          msort(a,c,m+1,t);   
          merge(c,b,s,m,t);   
      }   
  }   
    
  void   selectsort(int   a[],int   n)   
  {                                                               //简单选择排序...   
      int   i,j,k,t;   
        for(i=0;i<n;i++)   
        {   
          k=i;   
          for(j=i+1;j<n;j++)   
          if(a[j]<a[k])   k=j;   
          if(k!=i)   
        {   t=a[k];a[k]=a[i];a[i]=t;}   
        }   
  }   
    

3 楼

void   heapadjust(int   a[],int   s,int   m)           //堆排序..   
  {   
  //功能:若a[s...m]中只有a[s]不满足堆的定义,调用此函数可以使a[s...m]成为一个大顶堆   
  //(堆顶元素最大)   
          int   t,j;   
          t=a[s];   
          for(j=2*(s+1);j<=m+1;j*=2)   
          {   
                  if(j<m+1&&a[j-1]<a[j])     j++;   
                  if(t>=a[j-1])     break;   
                  a[s]=a[j-1];s=j-1;   
          }   
          a[s]=t;   
  }   
    
  void   heapsort(int   a[],int   n)         //堆排序.   
  {   
          int   i,t;   
          for(i=n/2;i>0;i--)   
          heapadjust(a,i-1,n-1);   
          for(i=n;i>1;i--)   
          {   
              t=a[0];a[0]=a[i-1];a[i-1]=t;   
              heapadjust(a,0,i-2);   
          }   
  }   
    
  void   JOSort(int   a[],int   n)                 //奇偶排序   
  {   
          int   i,flag,t;   
          do{   
                  flag=0;   
                  for(i=1;i<n;i+=2)   
                  if(a[i]<a[i-1])   
                  {flag=1;   t=a[i];a[i]=a[i-1];a[i-1]=t;}   
                  for(i=2;i<n;i+=2)   
                  if(a[i]<a[i-1])   
                  {flag=1;   t=a[i];a[i]=a[i-1];a[i-1]=t;}   
          }while(flag==1);   
  }   
    
    
  void   countsort1(int   a[],int   b[],int   n)         //记数排序   
  {   
          //最差的排序方法   
          int   i,j,count,visited[n];   
          for(i=0;i<n;i++)   
          visited[i]=i;             //为了辨别a中相同的数而设的标志数组   
          for(i=0;i<n;i++)   
          {   
          count=0;   
          for(j=0;j<n;j++)   
          if(a[j]<a[i])   count++;   
          while(visited[count]==-1)   count++;   
          visited[count]=-1;   
          b[count]=a[i];   
          }   
  }   
    
  void   countsort2(int   a[],int   b[],int   n)         //记数排序   
  {   
          //改进的记数排序   
          int   i,j,c[n];   
          for(i=0;i<n;i++)   
          c[i]=0;   
          for(i=0;i<n;i++)   
            {   
              for(j=i+1;j<n;j++)   
                  if(a[i]>a[j])   c[i]++;   
                  else   c[j]++;   
                  b[c[i]]=a[i];   
              }   
  }   

    

4 楼

辛苦了,顶一下

5 楼

辛苦辛苦,顶你一下

6 楼

顶:另记数排序的改进,通常用做名次计算
void   countsort2(int   a[],int   b[],int   n)         //记数排序   
  {   
          //改进的记数排序   
          int   i,j;   
          for(i=0;i<n;i++)  b[i]=1;   //名次初值均为第一名
          for(i=0;i<n;i++)   
              for(j=0;j<n;j++)   
                  if(a[i]<a[j])   b[i]++;   //值大名次在前
  }   

7 楼

knuth的大作中提到的排序方法至少有25种。

8 楼

辛苦了,顶一下 

9 楼

学习!

10 楼

表排序时while(p<i)   p=r[p].next;这句话什么意思??
请楼主说说,谢谢了!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册