十大排序(1)-----冒泡排序

2 篇文章 0 订阅
2 篇文章 0 订阅

请添加图片描述
今天刚学冒泡排序,赶紧来总结和复习,希望对读者也有帮助。

1.冒泡排序

冒泡排序应该是第一个遇到的排序,从动图上来看,冒泡排序是两两相邻之间进行对比的,并且大的数字会往后排,每执行一次排序,最后一个数字已经确定是最大的,所以每次排序长度都会少一个。那么n个数字执行排序,就会执行n-1趟的排序。

根据分析用c语言来执行代码

#include<stdio.h>
int main(){
    int arr[15] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}; // 定义一个数组。
    int sz = sizeof(arr) / sizeof(arr[0]); // 根据内存来计算数组的长度。
    int t ;  // 定义一个中间量t,来执行中间的交换
    if (sz <2)  // 如果数组中就两个元素,那么就直接输出,已经排好了。
    {
        return;
    }
    for (int i = sz - 1; i >0; --i) // 定义边界,n个数字,就排n-1趟,--i是每排一趟后面的数字都是排好了就不要需要比较了,所以要--i(i--也可以)。
    {
        for (int j = 0; j < i; j++)//边界定义好了,就执行中间的详细的过程,两两比较,如果前一个比后一个大,就执行交换。
        {
            if (arr[j]> arr[j+1])
            {
                t = arr[j+1];   // 运用中间量t,来执行两两数字间的交换。
                arr[j+1] = arr[j];
                arr[j] = t;        
            }
            
        }
        
    }
    for (int ok = 0; ok < sz; ok++)//上面的代码已经是排序好了已经是ok了,那么就用循环输出数组的数字。
    {
        printf("%d ",arr[ok]);
    }
    
    
    return 0 ;

    
}

结果如图在这里插入图片描述

2.优化

上面的代码是根据图片来写的代码,所以肯定需要进行优化的,我们继续分析,如果给的数组从一开始就已经排好了,那么就不需要n-1趟的排序了,可以直接输出了或者如果在中途整个数组就已经排好了,也可以不需要进行排序了,大大减少了时间了。所以我们考虑在中间加入一个量ifswap,来控制中间的执行过程。

c语言演示

#include<stdio.h>
int main(){
    int arr[15] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48}; 
    int sz = sizeof(arr) / sizeof(arr[0]); 
    int t ;
    int ifswap =0; // 定义一个量,来控制执行过程的排序。
    if (sz <2)  
    {
        return;
    }
    for (int i = sz - 1; i >0; --i) 
    {
        ifswap =0; // 每一趟的排序,都初始化ifswap
        for (int j = 0; j < i; j++)
        {
            if (arr[j]> arr[j+1])
            {
                t = arr[j+1];   
                arr[j+1] = arr[j];
                arr[j] = t;
                ifswap =1; //ifswap 赋值1就说明这一趟的数字没有还是乱的没有排序完。       
            }
            
        }
        if (ifswap ==0)
        {
            break; // 如果ifswap ==0 说明这一趟数的数组已经完整的排序好了,不需要继续执行比较的过程了,可以直接输出了
        }
        
    }
    for (int ok = 0; ok < sz; ok++)
    {
        printf("%d ",arr[ok]);
    }
    
    
    return 0 ;

    
}

3.python演示

毕竟也是学python的,用python来演示一下

arr = [3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]
n = len(arr)
for i in range(n-1,1,-1):
    ifswap =0
    for j in range(n-1):
        if arr[j]>arr[j+1]:
            arr[j],arr[j+1] = arr[j+1],arr[j]
            ifswap=1
    if ifswap ==0:
        break
print(*arr)

在这里插入图片描述

4.总结

这是接触第一个排序,后面还九种,我的目标是每个都熟烂于心,并且对以后数据结构与算法的学习有帮助。冒泡排序还可以用递归的写法来执行,在这里就不演示出来了,感兴趣的读者可以动手试试。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值