首页 > 编程语言 >经典算法冒泡排序之标志位优化版

经典算法冒泡排序之标志位优化版

时间:2022-12-08 10:07:47浏览次数:34  
标签:int 元素 len 算法 冒泡排序 经典 升序

前言

今天总结一下优化版的经典算法——冒泡排序,不同于以往的暴力二重for循环,这里的冒泡排序增加了一个标志位。我们要理解该冒泡排序的概念,算法流程与算法思想,探讨时间复杂度。

冒泡排序算法解析

一、理解冒泡排序思想

1、算法概念

也称气泡排序,是经典的交换排序方法。整个过程就是在无序区中对相邻元素进行两两比较,将不满足相对顺序的一对儿元素进行交换,再进行下一对元素的比较。

2、算法思想

总结来说,每一趟冒泡排序将会排好一个元素(极值)。不断的在无序区中执行该步骤,如果在某一次比较的过程中没有发生元素的交换,则证明元素都已经有序,可以提前结束整个算法。或者直到无序区中的元素减少到一个时,整个算法结束,此时整个序列有序。

二、算法分析

1、算法流程

假如要对该序列进行冒泡排序,解析一下算法流程:


经典算法冒泡排序之标志位优化版_升序

第一趟排序:7和4 交换位置,变为:


经典算法冒泡排序之标志位优化版_冒泡排序_02

第二趟排序:6和4 交换位置,变为:


经典算法冒泡排序之标志位优化版_冒泡排序_03

此时序列符合升序排列,提前结束循环,排序完成,退出循环

2、实现步骤

首先当外层循环 i 为0时,内层循环中从序列里第一个元素开始两两计较,不是升序则交换位置,是升序则往后遍历,那么第一次外层循环一定可以确定最大值且位置在序列末尾。
那么当外层循环次数增多,内层循环范围就要对应缩减,应为总长度 - 外层循环次数 - 1(减1是为了防止 i 等于0时数组溢出)。
重复以上步骤,如果序列已经为升序,通过标志位来提前结束程序。

三、代码实现

1、源码及运行效果

C++源代码:

#include<iostream>
using namespace std;
//冒泡排序声明
void maopaosort(int A[], int len);
//冒泡排序实现
void maopaosort(int A[], int len)
{
for (int i = 0; i < len; i++) {
int flag = 0;//标志位
for (int j = i; j < len - i - 1; j++) {
if (A[j] > A[j + 1]) {
int temp = A[j];
A[j] = A[j + 1];
A[j + 1] = temp;
flag = 1;
}
}
if (flag == 0)//如果已经升序,不再继续外层循环,结束此函数
return;
}
return ;
}
int main(void)
{
int A[7] = { 3,6,7,4,8,9,10 };
int len = sizeof(A) / sizeof(A[0]);
cout << "排序前:" << endl;
for (int i = 0; i < len; i++) {
cout << A[i] << " ";
}
maopaosort(A,len);
cout << "排序后:" << endl;
for (int i = 0; i < len; i++) {
cout << A[i] << " ";
}
}

运行效果:

经典算法冒泡排序之标志位优化版_升序_04

2、时间复杂度分析

最好的情况:
该序列为升序排列,内层循环执行了n-1次,那么相当于遍历了n次,时间复杂度为O(n)。
最坏的情况:
对于冒泡排序来说,最坏的情况依然是元素逆向有序,此时需要执行n-1趟,并且两两元素都需要交换,相当于是最小的元素排在末尾,—路交换到第一位,然后是次最小一路交换至第二位,此时的时间复杂度为: O(n^2)。
平均情况:
综合考虑下,冒泡排序算法的时间复杂度为O( n^2)

标签:int,元素,len,算法,冒泡排序,经典,升序
From: https://blog.51cto.com/u_15733182/5920403

相关文章

  • 机器学习--决策树分类算法及应用
    1.决策树分类算法原理1.1概述决策树(decisiontree)——是一种被广泛使用的分类算法。相比贝叶斯算法,决策树的优势在于构造过程不需要任何领域知识或参数设置在实际应用中,对......
  • 算法 KECP 被顶会 EMNLP 收录,极少训练数据就能实现机器阅读理解
    作者:王嘉宁、汪诚愚、邱明辉、石秋慧、王洪彬、黄俊、高明近日,阿里云机器学习平台PAI与华东师范大学高明教授团队合作在自然语言处理顶级会议EMNLP2022上发表基于Prompt-Tun......
  • 机器学习--Logistic回归分类算法及应用
    1.Lineage逻辑回归分类算法1.1概述Lineage逻辑回归是一种简单而又效果不错的分类算法什么是回归:比如说我们有两类数据,各有50十个点组成,当我门把这些点画出来,会有一条线区......
  • 《经典理论中严重的明显的错误,让相对论趁虚而入。》 回复
    《经典理论中严重的明显的错误,让相对论趁虚而入。》    https://tieba.baidu.com/p/8169148609     161楼内容没怎么看,就觉得这标题够酷。......
  • 基于Flocking算法的多智能体编队matlab仿真
    UP目录一、理论基础二、核心程序三、测试结果一、理论基础Flocking(有时也称为是warming或herding),拥有4项简单的规则,把它们组合在一起时,为自治主体群给出一个类似......
  • CSS Margin中5个经典布局解决方案,重难点知识,记得收藏复习
    前几天我在面试前端开发同学的时候,有问到关于margin基础布局相关内容的过程中,发现很多同学基本解释不清楚,今天刚好有点时间就整理了一篇笔记出来。就以下5点在CSS布局经常......
  • 算法练习:排列组合之子集合
    问题描述输入一个含有不同数字的序列,输出其所有子集合(含空集)。要求:1)集合里元素有序排列;2)输出结果不含有重复集合 举例输入序列{3,1,2}输出:{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} 问......
  • 算法练习:排列组合之全排列
    问题描述输入一个不含相同数字的序列,输出所有可能的排列。 问题分析与之前的“求解子集合”类似,使用递归方法:典型的在for循环内调用递归函数。不同的是,必须等到所有的数字......
  • 算法练习:排列组合之组合和
    问题描述给出一组不同的正整数序列和一个目标值,求出所有可能的组合,使得组合里所有元素和为目标值。要求:1)每个组合里的元素按照升序排列。2)输出组合里不含有重复的组合。3)输......
  • 算法练习:TopK_1
    问题描述求一维数组中最小的K个数。 方法一:排序先把数组从小到大排序,取前K个数。时间复杂度为O(nlogn)。如果数组过大,机器内存无法同时容纳整个数组,则需要使用外部排序。以......