冒泡排序与选择排序的比较

简介: 冒泡排序与选择排序的比较

冒泡排序与选择排序

冒泡排序:从首元素开始,依次比较前后两个元素,比较到最后一个元素的时候,即可得到最大值,最大值的位置就是末尾元素,下次排序不用考虑末尾元素

选择排序:从首元素开始,从未排序序列中选择出最小值(即记录最小值坐标位置),最小值坐标初始化为首元素坐标,首元素后面的元素依次与最小值比较,比较到最后一个元素即可得到最小值,再与首元素交换,下次排序不再考虑首元素

两者性能比较

bubbleSort.h

#ifndef BUBBLESORT_H

#define BUBBLESORT_H

#include <iostream>

#include <algorithm>

usingnamespacestd;

template<typenameT>

voidbubbleSort(Tarr[],intn){

   boolflag;

   do{

       flag=false;

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

           if(arr[i]<arr[i-1]){

               swap(arr[i],arr[i-1]);

               flag=true;

           }

       }

       n--;

   }while(flag);

}

#endif

selectionSort.h

#ifndef SELECTIONSORT_H

#define SELECTIONSORT_H

#include <iostream>

#include <algorithm>

usingnamespacestd;

template<typenameT>

voidselectionSort(Tarr[],intn){

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

       intminIndex=i;

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

           if(arr[j]<arr[minIndex])

               minIndex=j;

       }

       swap(arr[i],arr[minIndex]);

   }

}

#endif

SortTestHelper.h

#ifndef SORTTESTHELPER

#define SORTTESTHELPER

#include <iostream>

#include<cassert>

#include<ctime>

usingnamespacestd;

namespaceSortTestHelper{

   //生成有n个元素的随机数组,每个元素的随机范围是[rangeL,rangeR]

   int*generateRandomArray(intn,intrangeL,intrangeR){

       assert(rangeL<=rangeR);

       int*arr=newint[n];

       srand(time(0));

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

           arr[i]=rand()%(rangeR-rangeL+1)+rangeL;

       returnarr;

   }

   //打印数组

   template<typenameT>

   voidprintArray(Tarr[],intn){

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

           cout<<arr[i] <<" ";

       cout<<endl;

       return;

   }

   //判断是否排序

   template<typenameT>

   boolisSorted(Tarr[],intn){

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

           //如果前一个元素比后一个元素还要大,说明没有排序成功

           if(arr[i-1]>arr[i])

               returnfalse;

       returntrue;

   }

   //测试排序算法时间性能,参数为排序算法名称,排序算法函数指针,随机数组,数组个数

   template<typenameT>

   voidtestSort(stringsortName,void(*sort)(T[],int),Tarr[],intn){

       clock_tstartTime=clock();

       sort(arr,n);

       clock_tendTime=clock();

       //断言:表达式为假,程序会终止

       //assert(表达式);

       assert(isSorted(arr,n));

       cout<<sortName<<" : "<<double(endTime-startTime)/CLOCKS_PER_SEC<<  " s"<<endl;

       return;

   }

   //数组复制

   int*copyIntArray(inta[],intn){

       int*arr=newint[n];

       copy(a,a+n,arr);

       returnarr;

   }

   // 生成一个近乎有序的数组

   int*generateNearlyOrderedArray(intn,intswapTimes){

       int*arr=newint[n];

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

           arr[i]=i;

       srand(time(0));

       for(inti=0;i<swapTimes;i++){

           intposx=rand()%n;

           intposy=rand()%n;

           swap(arr[posx],arr[posy]);

       }

       returnarr;

   }

}

#endif

#include<iostream>

#include<algorithm>

#include "bubbleSort.h"

#include "selectionSort.h"

#include "SortTestHelper.h"

usingnamespacestd;

intmain(){

   intn=1000;

   cout<<"n = "<<n<<endl;

   //生成乱序数组

   int*arr=SortTestHelper::generateRandomArray(n,0,n);

   int*arr2=SortTestHelper::copyIntArray(arr,n);

   //测试耗时

   SortTestHelper::testSort("bubbleSort",bubbleSort,arr,n);

   SortTestHelper::testSort("selectionSort",selectionSort,arr2,n);

   //释放空间

   delete[] arr;

   delete[] arr2;

   return0;

}

打印结果:

n = 10000

bubbleSort : 1.843 s

selectionSort : 0.176 s

n = 100000

bubbleSort : 167.288 s

selectionSort : 14.919 s

数据量扩大10倍,排序所耗时间扩大100倍,可见两者时间复杂度都是O(n^2)

总结

两者比较方式相同,交换方式不同

冒泡排序可能每一次比较都会交换,最多比较n次,交换n次

选择排序,比较n次在未排序序列中选择出最值,才会进行交换,即比较n次,交换1次

可见虽然两者都是O(n^2)级别的排序算法,但选择排序仍优于冒泡排序

目录
相关文章
|
12天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1255 5
|
1天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
11天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1275 87
|
12天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1821 13