zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C++冒泡排序数据结构、算法及改进算法

C++算法数据结构 改进 冒泡排序
2023-06-13 09:14:51 时间

程序代码如下:

复制代码代码如下:

//BubbleSort.cpp:定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<cmath>
#include<iostream>
usingnamespacestd;
#define MAXNUM20
template<typenameT>
voidSwap(T&a,T&b)
{
   intt=a;
   a=b;
   b=t;
}
template<typenameT>
voidBubble(Ta[],intn)
{//把数组a[0:n-1]中最大的元素通过冒泡移到右边
   for(inti=0;i<n-1;i++)
   {
       if(a[i]>a[i+1])
           Swap(a[i],a[i+1]);
   }
}
template<typenameT>
voidBubbleSort(Ta[],intn)
{//对数组a[0:n-1]中的n个元素进行冒泡排序
   for(inti=n;i>1;i--)
       Bubble(a,i);
}
int_tmain(intargc,_TCHAR*argv[])
{
   inta[MAXNUM];
   for(inti=0;i<MAXNUM;i++)
   {
       a[i]=rand()%(MAXNUM*5);
   }
   for(inti=0;i<MAXNUM;i++)
       cout<<a[i]<<" ";
   cout<<endl;
   BubbleSort(a,MAXNUM);
   cout<<"AfterBubbleSort:"<<endl;
   for(inti=0;i<MAXNUM;i++)
       cout<<a[i]<<" ";
   cin.get();
   return0;
}

但是常规的冒泡,不管相邻的两个元素是否已经排好序,都要冒泡,这就没有必要了,所有我们对这点进行改进。设计一种及时终止的冒泡排序算法:

如果在一次冒泡过程中没有发生元素互换,则说明数组已经按序排列好了,没有必要再继续进行冒泡排序了。代码如下:

复制代码代码如下:


//BubbleSort.cpp:定义控制台应用程序的入口点。

//
#include"stdafx.h"
#include<cmath>
#include<iostream>
usingnamespacestd;
#define MAXNUM20
template<typenameT>
voidSwap(T&a,T&b)
{
   intt=a;
   a=b;
   b=t;
}
template<typenameT>
boolBubble(Ta[],intn)
{//把数组a[0:n-1]中最大的元素通过冒泡移到右边
   boolswapped=false;//尚未发生交换
   for(inti=0;i<n-1;i++)
   {
       if(a[i]>a[i+1])
       {
           Swap(a[i],a[i+1]);
           swapped=true;//发生了交换
       }
   }
   returnswapped;
}
template<typenameT>
voidBubbleSort(Ta[],intn)
{//对数组a[0:n-1]中的n个元素进行冒泡排序
   for(inti=n;i>1&&Bubble(a,i);i--);
}
int_tmain(intargc,_TCHAR*argv[])
{
   inta[MAXNUM];
   for(inti=0;i<MAXNUM;i++)
   {
       a[i]=rand()%(MAXNUM*5);
   }
   for(inti=0;i<MAXNUM;i++)
       cout<<a[i]<<" ";
   cout<<endl;
   BubbleSort(a,MAXNUM);
   cout<<"AfterBubbleSort:"<<endl;
   for(inti=0;i<MAXNUM;i++)
       cout<<a[i]<<" ";
   cin.get();
   return0;
}


改进后的算法,在最坏的情况下执行的比较次数与常规冒泡一样,但是最好情况下次数减少为n-1。