每天学习一个基础算法之冒泡排序

目录

前言:

一、冒泡排序的基本思路与实现方法

1.基本思路

2.实现方法

二、冒泡排序的执行过程示意图

三、冒泡排序的实现代码

 四、对冒泡排序复杂度的分析

1.时间复杂度

精确计算:

*采用大O的渐进表示法:

2.空间复杂度

采用大O的渐进表示法:


前言:

本文包含冒泡排序基本思路实现方法执行过程示意图代码,以及对时间和空间复杂度的分析。重点标红,部分加粗,可直接享用。

一、冒泡排序的基本思路与实现方法

1.基本思路

在待排序的一组数中,将相邻的两个数进行比较,以升序为例,若前面的数比后面的数大就交换两数,否则保持原状,如此下去,直至完成排序。

2.实现方法

从左边开始取数,与其右边一个数进行比较,比完一次后向右移一个位置取数,再与其右边一个数进行比较,直到数组末尾此为一趟,一趟结束后再从左开始第二趟取数,直到排序完成。

二、冒泡排序的执行过程示意图

以一趟为例,其它趟同理,不过多赘述。(手工画图,不够精美见谅)

 由示意图我们可以进一步看出,每排序完一趟,会有一个最大值(待排序部分的最大值),移动到最右端(待排序部分),成为已排序的部分,无需进行下一趟排序,并且可知若要排序数据个数为n,则只需排序n-1趟即可完成排序。

三、冒泡排序的实现代码

冒泡代码主体

//冒泡排序的实现
void bubble_sort(int arr[], int sz)
{
    int i = 0;
    int j = 0;
    //趟数
    for (i = 0; i < sz - 1; i++)
    {
        //每趟比较次数
        for (j = 0; j < sz - 1 - i; j++)//每过一趟会有一个最大值移到最后,该最大值无需进行后续比较
        {
            if (arr[j] > arr[j + 1])
            {
                int tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}

测试部分

#include <stdio.h>
int main()
{
    int arr[] = { 10,7,4,9,6,1,8,3,2,5 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    bubble_sort(arr, sz);
    int i = 0;
    //对排序完成的数组进行输出
    for (i = 0; i < sz; i++)
    {
        printf("%d ",arr[i]);
    }

}

 四、对冒泡排序复杂度的分析

1.时间复杂度

时间复杂度:表示算法中基本操作(一般表示重复执行的操作)的执行次数,并不需要计算精确的执行次数,而只需要计算大概执行次数。 但我们计算时一般会尽可能先算其精确值,再通过大O的渐进表示法,取对变化趋势影响最大的部分。

精确计算:

冒泡排序采用双层嵌套循环,外层循环次数为N-1(N表示要比较的数组的元素个数),内层循环次数N-1-i(i表示当前外层循环的情况

计算起来便是:(n-1)+(n-2)+(n-3)+……+3+2+1(为一个等差数列)

=1/2*n^2-1/2*n

*采用大O的渐进表示法:

表示为O(N^2) 

2.空间复杂度

空间复杂度:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量,算的是额外创建变量的个数,也使用大O的渐进表示法。

冒泡排序算法的主体运用额外空间很少,几乎可以忽略不记,且不会因数据大小而变化,始终为一个常数

采用大O的渐进表示法:

表示为O(1)

每日一学,今天你又超过了百分之九十九的人。

如果本篇文章对你有帮助,请点个关注和赞吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值