我的排序算法

 

复杂度为n2的算法

 

/* 冒泡排序

 * input int数组 length of 数组 

 * 输出 在int数组上原地排序 

 */

void  bubble(int a[], int n)

{

      int i,j,temp;     

      for (i = 0; i < (n - 1); i++ ) 

           for ( j= n - 1; j > i; j-- ) {

                if (a[j] < a[j-1]) {

                    temp = a[j-1];

                    a[j-1] = a[j];

                    a[j] = temp;

                }

           }

}

 

 

 

 

/* 插入排序

 * input int数组 length of 数组 

 * 输出 在int数组上原地排序 

 */

void insertSort(int a[], int n)

{

     int i,j,key;

     for ( i = 1; i < n; i++) {

          key = a[i];

          for (j = i-1; j > -1; j--) {

              if (a[j] > key)

                  a[j+1] = a[j];

              else

                  break;

          }//end of  for 2

          a[j+1] = key ;

          printf("%d   /n",j);

     }//end of  for 1

 

     //printf("%d",n);     

}

 

 

//插入排序的递归实现

 

void insertSortReCurse(int a[], int n)

{

     if (n > 1) {

         insertSortReCurse(a, n-1);   

 

         int i,j,key;

          key = a[n-1];

          for (j = n-2; j > -1; j--) {

              if (a[j] > key)

                  a[j+1] = a[j];

              else

                  break;

          }//end of  for 2

          a[j+1] = key ;

      //   print(a,n);

         //getchar();

     }

 

 

 

复杂度为nlogn的算法

 

 

/* 合并排序

 * input int数组 length of 数组 

 * 输出 在int数组上原地排序 

 *

 *  两个函数 merge 是主函数递归的将数组划分 

 *  

 *  mergesort 将两个排过序的数组合并 

 *  错误:if ( i == p - b +1 )  写成  if ( i = p - b +1 ) 

 */

 

void mergeSort(int a[],int b, int e, int p)

{

    // printf("b = %d   p = %d  e = %d/n", b ,p,e);

     int t1[p - b +1] ;

     int t2[e - p] ;

     int i,j,k;

     for (i = 0; i < (p - b +1); i++ )

         t1[i] = a[b+i];

     for (i = 0; i < (e - p); i++ )

         t2[i] = a[p+1+i];

     // print(t1  ,p - b +1 );printf("[%d]/n",p - b +1);

    //  print(t2  ,e-p );printf("[%d]/n",e-p);

     i = 0;

     j = 0;

     k = b;

     while ( (i < (p - b +1)) && (j < (e - p)) )  {

           if ( t1[i] > t2[j] )

             a[k++] = t2[j++];

           else

             a[k++] = t1[i++];  

     }  

     if ( i == (p - b +1) )

        while(j < (e - p) )

             a[k++] = t2[j++];

     else

         while(i < (p - b +1) )

             a[k++] = t1[i++];  

  //   print(a ,10);

}

 

 

 

/*

 *  b : start of under

 *  e : end of under

 */ 

void merge(int a[] ,int b, int e)

{

    // printf("%d%d");

     if (b < e) {

        int p = (b + e) / 2;          

        merge(a, b, p );

        merge(a, p + 1 , e );

        mergeSort(a, b, e, p);

     }    

}

 

 

 

 

 

 

/*  quicksort 

 *

 *    先排序 再分开 

 *  b : start of under

 *  e : end of under

 */ 

int quickSort(int a[], int b , int e) 

{

    int key = a[e] ;

    int i,j,temp;

    i = b;//i 是用来指向最后大于key的序数 

    j = b;//j 是用来找到小于key 的序数 

    while (  j < e ) {

          if ( key <= a[j] ) {

             j++;      

          }

          else {

 

             temp = a[i];

             a[i] = a[j];

             a[j] = temp;

             i++;

             j++;

          }          

    }    

    temp = a[i];

    a[i] = a[j];

    a[j] = temp;

    return i;

    //print(a,10);

  //  getchar();

}

 

void  quick(int a[], int b ,int e)

{

      if ( b < e) {

         int q = quickSort(a , b , e );

         quick(a, b ,q-1);

         quick(a, q+1 , e);

      }

 

 

 

 

 

/*  heap sort 

 *    教训: 儿子父亲的下标关系搞清楚 i 2*i+1 2*i+2  

 *    heapDown 时 比较儿子父亲最大值时注意 

 *    建最小堆时 交换的对象。 

 *    注意建立思维模型。 

 *

 * n 为 数组长度

 */

void heapDown(int a[],int key, int n)
{
     int max;
     for (int i = key ; 2*i +1 < n ; i = max ) {
         if ( (2 * i + 2) < n )  
            if ( a[i*2 +1 ] < a[i*2+2] )
               max = i*2+2 ;
            else
               max = i*2 + 1   ;
         else
            max = 2 * i +1 ;      
         if (a[i] < a[max]) {
            int temp;
            temp = a[i];
            a[i] = a[max];
            a[max] = temp;
         }
         
     }
  
}
 
void  buildMaxHeap(int a[], int n)
{
      int i = (n-1) / 2;
      while (i > -1) {
            heapDown(a, i, n);
            i--;   
      }
}
void heapsort(int a[], int n)
{
     buildMaxHeap(a,n);     
     for (int i = 0; i < n-1 ; i++) {
         int temp ;
         temp = a[n-1-i];
         a[n-1-i] = a[0] ;
         a[0]  = temp;
         heapDown(a, 0, n-i-1);
     }
     
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值