交换排序——冒泡排序和快速排序(递归和非递归)

9.2 交换排序

交换排序的基本思想是对数据表中两个数据元素的关键字进行比较,如果发生逆序(即排列顺序与排序后的次序正好相反),则两者交换位置,直到所有数据元素都排好序为止。

冒泡排序

  1. 冒泡排序(bubble sort) 的算法思想是:设数据表elem中有n个数据元素,首先对数据表中第一、二个数据元素(elem[0]和 clem[1])进行比较,如果 elem[0]>eicm[1],则交换 elcm[0]和 elem[1];然后对第二、三个数据元素做同样处理;重复此过程,直到处理完最后两个相邻的数据元素。称此过程为一趟冒泡,它将关键字最大的数据元素移到数据表的最后一个位置。其他数据元素一般也都向排序的最终位置移动。然后进行第二趟排序,对数据表中前n-1个元素进行与上述同样的操作,其结果使整个数据表中关键字次大的数据元素被移到elem[n-2]的位置。如此最多进行n-1趟冒泡就能把所有数据元素排好序。
  2. 对于冒泡排序,当数据元素的初始排列已经按关键字从小到大排好序时,此算法只执行一趟冒泡,进行了n-1次关键字比较,不移动数据元素,这是最好的情形;最坏的情形是数据元素的初始排列按关键字从大到小排列(逆序),此时算法执行n-1趟冒泡,第i趟(1<=i<n)做了n-i次关键字比较。执行了n-i次数据元素交换。这样在最坏情形下总的关键字比较次数和数据元素移动次数分别为:
    在这里插入图片描述
  3. 在最坏情况下。冒泡排序的时间复杂度为O(n2)。冒泡排序需要一个附加存储空间以实现数据元素的交换。显然,冒泡排序算法是一种稳定的排序方法。
  4. 算法实现
//顺序表的冒泡排序
template<class ElemType> void BubbleSort(ElemType elem[],int n)
{
   
    bool finish=false;
    int i=1;
    while(i<n && !finish)
    {
   
        finish=true;
        for(int j=0; j<n-i; j++)
            if(elem[j]>elem[j+1])
            {
   
                //swap(elem[j],elem[j+1])
                ElemType tmp=elem[j+1];
                elem[j+1]=elem[j];
                elem[j]=tmp;

                finish=false;
            }
        i++;
    }
}
//双向链表的冒泡排序
template<class ElemType> void DbLinkList<ElemType>::BubbleSort()
{
   
    DblNode<ElemType> *q=NULL,*r=NULL,*last;
    last=NULL;
    while(head->next!=last)
    {
   
        q=head->next;
        while(q->next!=last)
        {
   
            if(q
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值