前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >冒泡排序和简单选择排序的算法实现及优化

冒泡排序和简单选择排序的算法实现及优化

作者头像
lexingsen
发布于 2022-02-24 07:32:22
发布于 2022-02-24 07:32:22
36200
代码可运行
举报
文章被收录于专栏:乐行僧的博客乐行僧的博客
运行总次数:0
代码可运行

一.在排序算法中使用到的结构与函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int arr[] = {50,60,90,10,30,40,20,70,80};
int len = sizeof(arr)/sizeof(arr[0]);
//由于数组作为形参会退化为指针,所以在函数中计算不出数组的长度。
//因此数组的长度应在主函数中求出,并传入到函数当中以便使用。
函数

void swap(int *arr,int i,int j)
{
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

二.冒泡排序

冒泡排序作为最基础的排序算法,其核心就是通过两两相邻的同类型数据进行比较,进行交换。一组数据经过一次比较之后,就可以最大或最小的元素放在 尾部,现实生活中很形象的例子就是冒泡,其名称也因此而来。 下面实现冒泡排序算法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void BubbleSort(int *arr,int len)
{
    for(int i = 0;i < len - 1;++i)
    {
        for(int j = 0;j < len - 1 -i;++j)
        {
            if(arr[j] > arr[j+1])
            {
                swap(arr,j,j+1);
            }
        }
    }
}

上述的算法虽然可以成功的解决一组数据排列的问题,但是涉及到一个具体的算法时,我们就必须从两方面考虑其性能及空间复杂度时间复杂度

由于计算机硬件发展迅速,硬件价格也随之迅速降低。在实际使用算法时,往往通过牺牲空间复杂度来获取较低的时间复杂度,这样的做法其实也是合理的。

针对时间复杂度,对冒泡排序算法进行优化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int arr[] = {11,22,33,44,55,66,77,88,99};
//要求对arr数组中的数字进行升序排序,可以发现,进过一趟比较。数组中的数字顺序已完成排序
//但是在算法中还依此进行了七趟没有必要的比较
第一趟 int arr[] = {11,22,33,44,55,66,77,88,99}; 
第二趟 int arr[] = {11,22,33,44,55,66,77,88,99}; 
第三趟 int arr[] = {11,22,33,44,55,66,77,88,99}; 
第四趟 int arr[] = {11,22,33,44,55,66,77,88,99}; 
第五趟 int arr[] = {11,22,33,44,55,66,77,88,99}; 
第六趟 int arr[] = {11,22,33,44,55,66,77,88,99}; 
第七趟 int arr[] = {11,22,33,44,55,66,77,88,99}; 
第八趟 int arr[] = {11,22,33,44,55,66,77,88,99};
//可见,这样的算法在时间复杂度上的浪费非常大 

当然上述的例子,是非常极端的。但是在实际的排序问题中也不乏数据几个或多个相邻的数据已经有序,因此针对已经有序的序列,就不需要进行排序。减少浪费不必要的时间。

优化后的冒泡排序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void BubbleSort(int *arr,int len)
{
    bool flag;//设置标识位,用于判断相邻两数据之间是否有序
    for(int i = 0;i < len - 1;++i)
    {
        flag = true;//flag设置为flase,假设已经有序
        for(int j = 0;j < len - 1 - i;++j)
        {
            if(arr[j] > arr[j+1])
            {
                flag =  false;//进入此分支,证明无序
                swap(arr,j,j+1);
            }
        }
        if(flag == true)
        {
            break;//证明此时数组中数据已经完成排序
        }
    }
}

三.简单选择排序 思路:简单选择排序算法就是通过n-i次关键字间比较,从n-1-i个记录中选择出关键字最小的的,并和第i个(0≤i≤n-i)个记录进行交换。 简单选择排序算法的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void SelectSort(int *arr,int len)
{
    for(int i = 0;i < len;++i)
    {
        for(j = i+1;j < len;++j)
        {
            if(arr[i] > arr[j])
            {
                swap(arr,i,j);
            }
        }
    }
}

但实际上上述已经实现的简单选择排序也不满足算法在时间复杂度上的要求,其实优化的目的与冒泡排序相同,都是避免出现在已经有序的序列中进行排序,所以其优化的思路与冒泡排序的优化方式一致。 优化的简单排序算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void  SelectSort(int *arr,int len)
{
    bool flag;
    for(int i = 0;i < len;++i)
    {
        flag = true;
        for(int j = 0;j < len;++j)
        {
            if(arr[i] < arr[j])
            {
                flag = true;
                swap(arr,i,j);
            }
        }
        if(flag == true)
        {
            break;
        }
    }
}

上述的标志位法还可以用到许多的实际例子中,如求素数个数问题等。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
排序五 简单选择排序
该文介绍了冒泡排序算法的基本原理和实现过程,并通过示例代码和运行结果来展示冒泡排序算法的运行过程。同时,文章还对冒泡排序算法的时间复杂度和空间复杂度进行了分析。
静默虚空
2018/01/05
6520
排序五 简单选择排序
冒泡排序,选择排序,插入排序算法
冒泡排序 思路:二二交换,可以让最大的数沉底,在length-1次,就有序了 package day20180315; public class Maopao { public static void main(String[] args) { int[] test= {-9,88,12,75,36,-621,10}; mpsort(test); System.out.print(" sort the end of:"); display(te
热心的社会主义接班人
2018/04/27
7580
一文带你读懂排序算法(一):冒泡 & 快速选择排序 & 简单插入排序算法
排序是确保数据规则有序的有效手段。日常开发里,我们常用到的是“冒泡”、“插入排序”、“选择排序”三种。
后台技术汇
2022/05/28
2130
一文带你读懂排序算法(一):冒泡 & 快速选择排序 & 简单插入排序算法
冒泡排序,选择排序,插入排序,折半插入排序
冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录的为止,这里的反序指的是不符合当前指定排序规则的数字
大忽悠爱学习
2021/11/15
3320
排序之简单选择排序
  本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此;一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自己学习过程,加入了一些自己的理解,同时也希望给别人提供帮助。
青石路
2018/09/10
4850
排序之简单选择排序
冒泡排序、选择排序和二分查找
最近有小伙伴后台留言表示要详细了解一下冒泡排序和选择排序的原理,so阿Q便在这里做一个简单的介绍,希望对小伙伴加深冒泡排序以及选择排序的理解有点小帮助吧。
阿Q说代码
2021/05/13
5460
我们真的搞懂这些排序算法了吗?(一)
或许你已经学过了这些常见的排序算法,或者你看过了别人写的文章,但是这篇文章绝对不会浪费你的时间,一定会有所收获的。
godweiyang
2021/02/24
4710
我们真的搞懂这些排序算法了吗?(一)
【数据结构】排序算法---冒泡排序(动图演示)
冒泡排序(英语:Bubble sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
Crossoads
2024/10/22
4420
【数据结构】排序算法---冒泡排序(动图演示)
简单选择排序和堆排序
最近在全面学习数据结构,常用算法记录:简单选择排序和堆排序,简单选择排序的基本思想是每一趟在待排序元素中选取关键字最小的元素加入有序子序列,直到所有元素有序,总共进行 n-1 趟。堆排序的基本思想见文末图片。
字节星球Henry
2022/09/20
6180
简单选择排序和堆排序
数据结构与算法笔试面试题整理
b.对每一对相邻的元素做同样的工作,从开始的第一对一致到结尾的最后一对,经过这一步,最后的元素将是最大值;
Zoctopus
2018/09/28
1.7K0
数据结构与算法笔试面试题整理
选择排序算法详解_八大排序算法图解
选择排序就是从待排序的元素中选择最小(最大)的元素,将其放在有序序列的相应位置,使这些元素构成有序序列。选择排序主要有两种:简单选择排序和堆排序。
全栈程序员站长
2022/11/17
3430
选择排序算法详解_八大排序算法图解
排序算法 (十) ---简单选择排序
首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
葆宁
2022/01/13
3690
排序算法 (十) ---简单选择排序
十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)
该文章介绍了如何利用C++实现一个简单的HTTP服务器,包括处理客户端请求、解析请求体、返回响应以及关闭连接。主要使用了C++的流和字符串处理功能,以及基本的HTTP协议知识。
s1mba
2017/12/22
1.1K0
十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)
【初阶数据结构】冒泡排序和选择排序(用C语言实现,主要讲思维)
讲到排序相信大家一定对一种排序很熟悉,它的名字就叫做冒泡排序。这个排序大家在学习各种语言时,都是一道绕不去的坎。本文还会介绍另一个比较简单的排序 —— 选择排序,以及给大家讲一下选择排序的另一种写法(但是效率没有发生大的改变)。
埋头编程
2024/10/16
6640
【初阶数据结构】冒泡排序和选择排序(用C语言实现,主要讲思维)
【数据结构】八大排序之简单选择排序算法
依照这个思路,我们对简单选择排序进行优化,使其一趟就可以将最大的元素和最小的元素都选出来交换到相应的位置上,综上,代码实现如下:
修修修也
2024/04/01
8930
【数据结构】八大排序之简单选择排序算法
《数据结构与算法之美》——冒泡排序、插入排序、选择排序
当然,撇开这些业务场景,排序算法本身有一些自己的衡量指标,比如我们经常提到的复杂度分析。
JackieZheng
2019/05/25
4550
排序算法
冒泡排序:Bubble sort,也叫做起泡排序,是一种交换性质的排序,基本思想是相邻两条记录进行比较,不符合规则就交换,符合规则不交换。冒泡排序的具体步骤描述如下
mindtechnist
2024/08/08
1010
排序算法
7.4.1简单选择排序
选择排序的基本思想是:每趟(例如第i趟)在后面 n-i+1(i=1,2,...,n-1)个待排序元素中选取关键字最小的元素,
week
2018/08/27
4740
各种基本算法实现小结(五)—— 排序算法
* 选择排序 |____简单选择排序 |____堆排序 |____归并排序 * 交换排序 |____冒泡排序 |____快速排序 * 插入排序 |____直接插入排序 |____折半排序 |____希尔排序 * 分配排序 |____箱排序 |____基数排序
阳光岛主
2019/02/20
4020
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
  冒泡排序是比较基础的排序算法之一,其思想是相邻的元素两两比较,较大的数下沉,较小的数冒起来,这样一趟比较下来,最大(小)值就会排列在一端。整个过程如同气泡冒起,因此被称作冒泡排序。   冒泡排序的步骤是比较固定的:
全栈程序员站长
2022/09/14
8410
十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序[通俗易懂]
推荐阅读
相关推荐
排序五 简单选择排序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验