冒泡排序(超详细)

一、前言

我们常常熟知的排序目前流行的有以下几种:冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序,桶排序,拓扑排序…
看起来一个一个高大上,可能有人绝得后面几种排序有点摸不清头脑,也就是不知道具体实现原理是怎么样的,为了知识贯彻到大脑里面,我们分组来学习

那么我们这次学普通排序里面的第一种,冒泡排序
下次我会把后面的排序一一记录
废话不多说,开始吧!

二、冒泡排序

冒泡排序相信大家都十分熟悉了,如果你还不认识它,那就跟着这篇文章慢慢来学习吧,坚持总会成功的。要是一遍么看懂,那就多看几遍,总会看懂的!

实现原理: 每次将遍历到的元素和它后面所有元素,进行比较,如果满足我们比较的规则,则交换元素的位置,直到所有元素遍历结束,旨在每次遍历将尽量小的元素提到前面
待排序数组:4 3 5 1 0 2
排序完成后:0 1 2 3 4 5

注意:排序结果有很多种,具体看自己的需求,我这里只是将数组从小到大排序来举例而已,数组是从下标0开始的
下面我们来看看流程图
第一次选定元素:(位置索引:0,值:4)
②开始遍历 “索引0” 后面的所有元素,此时遍历到了元素3,和索引为0的 4 进行比较。
在这里插入图片描述
比较发现:3 比索引0处的 4 还小,互换位置,数组变化如下
在这里插入图片描述
②继续遍历 索引0后面的元素,此时遍历到了元素5,和索引为0的 3 进行比较。在这里插入图片描述
比较发现:5 比索引0处的 3 还要大,此时不交换位置,所以此时元素位置仍然如下
在这里插入图片描述
③继续遍历 索引0 后面的元素,此时遍历到了元素1,和索引为0处的3 进行比较。
在这里插入图片描述
比较发现:1 比索引0处的 3 还要小,交换位置,此时元素位置如下
在这里插入图片描述
④继续遍历 索引0 后面的元素,此时遍历到了元素0,和索引为0处的1 进行比较。
在这里插入图片描述
比较发现:0 比索引0处的 1 还要小,交换位置,此时元素位置如下
在这里插入图片描述
⑤继续遍历 索引0 后面的元素,此时遍历到了元素2,和索引为0处的 0 进行比较。
在这里插入图片描述
比较发现:2 比索引0处的 0 还要大,此时不交换位置,所以此时元素位置仍然如下
在这里插入图片描述
那么到这里第一轮循环已经遍历完成了,我们发现,现在数组的首位置(也就是索引为0)处的元素已经是整个数组中最小的那个了,现在我们下一轮循环应该是锁定索引1处的位置,遍历索引1处后面所有的元素,寻找整个数组第二个的元素
这里就不再贴流程图了(流程图做的真的很累)
如果到现在还不知道怎么完成冒泡排序,建议多看看课本吧,再慢慢理解后自己画画,这个很快就可以掌握的,下面我贴一段java版的冒泡排序代码

import java.util.Arrays;

@SuppressWarnings("all")
public class SortClass {
    
    

    // 冒泡排序
    public static void bubbleSort(Comparable[] a){
    
    
        int len = a.length;
        for(int i=0;i<len;++i)
            for(int j=i+1;j<len;++j)
                if(greater(a[i],a[j]))
                    swap(a,i,j);
    }
	// 比较待排序数组里面两个元素的大小
	// 如果 a>b .则返回true,否则返回false
    public static boolean greater(Comparable a , Comparable b){
    
    
        return a.compareTo(b)>0;
    }
	
	// 交换a数组里面索引 i 和索引 j 里面的值
    public static void swap(Comparable[] a,int i,int j){
    
    
        Comparable mid;
        mid = a[i];
        a[i] = a[j];
        a[j] = mid;
    }

    public static void main(String[] args) {
    
    
        // 测试冒泡排序
        // Integer 是 int 的封装类
        Integer[] a = {
    
    2,4,1,5,8,10,0,3,6};
        SortClass.bubbleSort(a);
        for(int c : a){
    
    
            System.out.print(c+" ");
        }
        System.out.println();
    }
}

数组结果如下
在这里插入图片描述
c 语言的 冒泡排序

// c语言版的冒泡排序,n 是数组 a 的长度
    void bubble(int& a[],int n){
    
    
        for(int i=0;i<n;++i)
            for(int j=i+1;j<n;++j)
                if(a[j]<a[i])
                    swap(a[i],a[j]);
    }

c++ 语言的 冒泡排序

// c++语言版的冒泡排序,v 是动态数组
    void bubble(vector<int> &v){
    
    
        int n = v.size();
        for(int i=0;i<n;++i)
            for(int j=i+1;j<n;++j)
                if(v[j]<v[i])
                    swap(v[i],v[j]);
    }

猜你喜欢

转载自blog.csdn.net/YSJ367635984/article/details/113682160
今日推荐