常用排序算法

约定待排序的记录的数据结构为:

typedef  struct

{

     int  key;

     elemtype  data;

} redtype;

redtype  r[n];

一、插入排序

1.直接插入排序

基本思路:依次把待排序的记录逐一按其关键字的大小插入到一个已经排好序的有序序列中去,直到所有的记录插完为止,得到一个新的有序序列。

void  direct_insert(redtype  r[ ], int  n)

{

      int  i, j;

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

             r[0] = r[i];

             j = i - 1;

            while(r[0].key < r[j].key) {

                 r[j + 1] = r[j];

                 j --;

            }

            r[j + 1] = r[0];

     }

}

结果:稳定排序,时间复杂度O(n方),空间复杂度O(1)

2.希尔排序(缩小增量排序)

说明:也是一种插入排序类的算法,不稳定排序,但在时间效率上有较大的改进。

基本思路:选定第一个增量d1 < n,把全部记录按此值从第一个记录起进行分组,所有相距为d1的记录作为一组,先在各组内进行插入排序,然后减小间隔,取第二个增量d2<d1,重复上述分组和排序过程,直至增量值di=1为止,即所有的记录放在同一组内排序。

对于每一趟的增量di可以有多种取法。希尔提出的取法是:d1=n/2,di+1=di/2

void  shell_sort(redtype  r[ ], int  n)

{

      redtype  x;

      int i,j,d;

      d = n/2;

      while(d >=1) {

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

                 x = r[i];

                 j = i - d;

                 while( j > 0; && x.key < r[j].key) {

                      r[j + d] = r[j];

                      j = j - d;

                 }

                 r[j + d] = x;

           }

           d = d / 2;

      }

}

3.冒泡排序
void bubble_sort(redtype r[],int n)
{
   int i,j,k;
   redtype  x;
   k=1;
   i=1;
   while(i<n&&k>0){
      k=0;
      for(j=0;j<n-i;j++){
         if(r[j+1].key<r[j].key){
             k++;
             x=r[j+1];
             r[j+1]=r[j];
             r[j]=x;
          }
       }
      i++;
   }

}

4.快速排序

void quick_sort(redtype r[],int low,int high)
{
   int i,j,k;
   redtype x;
   if(low < high){
       i=low;
       j=high;
       x=r[i];
       while(i < j){
           while(r[j].key>=x.key&&i<j) j--;
           if(i < j){
              r[i]=r[j];
              i++;
            }
           while(r[i].key<=x.key && i<j) i++;
           if(i<j){
              r[j]=r[i];
              j--;
            }
        }
       r[i]=x;
       quick_sort(r,low,j-1);
       quick_sort(r,j+1,high);
   }
}

5.简单选择排序

void selection_sort(redtype  r[ ],int  n)

{

    int i,j,k,t;

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

        k = i;

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

            if(r[j].key < r[k].key) {

                 k = j;

            }

        }

        if(k != i) {

            t = r[k];

            r[k]=r[i];

            r[i]=t;

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值