交换类排序法

交换类排序思想:通过一系列交换逆序元素进行排序的方法

1.冒泡排序:通过对相邻的数据元素进行交换,逐步将待排序序列变成有序序列的过程

void  BubbleSort(RecordType r[ ],int length)  //对记录数组r做冒泡排序,length为数组的长度

{

          n=length;   change=TRUE;

         for(i=1;i<=n-1&&change;++j)

         {

                change=FALSE;

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

               {

                    if(r[j].key > r[j+1].key)

                    {

                        x=r[j];

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

                        r[j+1]=x;

                        change=TRUE;

                    }

               }

   }

总移动次数3n(n-1)/2次,时间复杂度O(n2)  空间复杂度O(1)

 

2.快速排序

算法改进要点:由于冒泡排序扫描过程中只对相邻的两个元素进行比较,因此在互换两个相邻元素时只能消除一个逆序,

如果能通过两个(不相邻的)元素的交换,消除待排序记录中的多个逆序,则会大大加快排序的速度;

void  QKSort(RecordType r[ ],int low,int high)  //对记录数组r[low,high]用快速排序算法进行排序

{

          if(low < high)

          {

              pos=QKPass(r,low,high);  //调用一趟快速排序,以枢轴元素划分为两个子表

                        QKSort(r,low,pos-1);  //对左部子表快速排序

                        QKSort(r,pos+1,high);  //对右部子表快速排序

           }

}

一趟快速排序算法

int  QKPass(RecordType r[ ],int low,int high)  //对记录数组r中的r[low]至r[high]部分进行一趟排序,并得到基准的位置,

使得排序后的结果满足其之后(前)的记录的关键字均不小于(大于)基准记录

{

        x=r[low];  //选择基准记录

       while(low < high)

        {

             while(low < high && r[high].key > = x.key)

                     high--;    //high从右到左找小于x.key的记录

            if(low < high)       { r[row]=r[high];  low++; } 找到小于x.key的记录,则送入"空单元"r[low]

 

             while(low < high && r[low].key <= x.key) 

                     low++; //low从左到右找大于x.key的记录

            if(low < high) {  r[high]=r[low];  high--;}  //找到大于x.key的记录,则送入"空单元"r[high]

      }

     r[row]=x;  //将基准记录保存到low=high位置

return low;   //返回基准记录的位置

}

快速排序递归算法的执行过程对应一颗二叉树,理想情况下是一颗完全二叉树,递归工作栈的大小与上述递归调用二叉树的深度对应,平均情况下辅助空间复杂度O(log2 n)  时间复杂度O(nlog2 n) 最好(nlog2 n) 最坏 O(n2)

冒泡排序  空间复杂度O(1)      时间复杂度O( n2)   最好(n)   最坏 O(n2)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值