几种简单排序

以下内容为程序代码:

int selectsort(int p[], int n);
int insertsort(int p[],int n);
int appendsort(int p[], int m, int n);
int bubblesort(int p[],int n);
int combsort(int p[], int n);

int bubblesort(int p[], int n)
{
   int op=0;
   int i, j;
   int temp;
   int flag=1;

   for (j=n-1; flag>0 && j>0; j--) {
      flag=0;
      for (i=j; i>0; i--) {
         if (p[i-1]>p) {
            temp=p;
            p=p[i-1];
            p[i-1]=temp;
            flag=1;
         }
         op++;
      }
   }
   return op;
}

int selectsort(int p[], int n)
{
   int op=0;
   int i, j, max;
   int temp;
   for (j=n-1; j>0; j--) {
      max=j;
      temp=p[j];
      for(i=j-1; i>=0; i--) {
         if (p>temp) {
            max=i;
            temp=p;
         }
         op++;
      }
      p[max]=p[j];
      p[j]=temp;
      op++;
   }
   return op;
}

int insertsort(int p[],int n)
{
   int op=0;
   int i,j,temp;
   for (j=1; j<n; j++) {
      temp=p[j];
      for(i=j-1; i>=0 && p>temp; i--) {
         p[i+1]=p;
         op++;
      }
      p[i+1]=temp;
      op++;
   }
   return op;
}
/*
* 把小列表插入大列表中,要求大列表有序,被其他算法调用。
*/
int appendsort(int p[],
      int m, /* 前半部分列表长度和后半部分列表的开始位置 */
      int n)
{
   int op=0;
   int i,j,temp;
   if (m>=n)
      for(j=m; j<n; j++) {
         temp=p[j];
         for(i=j-1; i>=0 && p>temp; i--) {
            p[i+1]=p;
            op++;
         }
         p[i+1]=temp;
         op++;
      }
   else
      for(j=m-1; j>=0; j--) {
         temp=p[j];
         for(i=j-1; i>=0 && p>temp; i--) {
            p[i+1]=p;
            op++;
         }
         p[i-1]=temp;
         op++;
      }    
   return op;
}

/*
* 改进的冒泡排序算法,性能接近堆排序。
* 在 1991 年由 S. Lacey 和 R. Box 发明。
* 据说在特定的重复性输入下有可能衰退成冒泡排序。
*/
int combsort(int p[], int n)
{
   int op=0;
   int i;
   int temp;
   int gap=n;
   int flag=1;
    
   while (gap>1 || flag!=0) {
      flag=0;
      gap=(gap==9||gap==10)?11:gap*10/13;
      if (gap==0)
         gap=1;
      for (i=n-1; i-gap>=0; i--) {
         if (p[i-gap]>p) {
            temp=p;
            p=p[i-gap];
            p[i-gap]=temp;
            flag=1;
         }
         op++;    
      }
   }
   return op;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值