数据结构之排序-冒泡排序

本文详细介绍了冒泡排序的原理,通过实例展示了冒泡排序的过程,从第一次到第八次排序,阐述了为什么冒泡排序对于n个数只需要进行n-1次。最后提到了冒泡排序的程序实现部分。

一.冒泡排序的原理:逐个相邻元素相互比较,将最大或者最小的值冒泡(沉底)到最高位;如下图:

                        

第一次排序的结果为:9,5,10,7,6,8,2,4,11;

第二次排序的结果为:5,9,7,6,8,2,4,10,11;

第三次排序的结果为:5,7,6,8,2,4,9,10,11;

第四次排序的结果为:5,6,7,2,4,8,9,10,11;

第五次排序的结果为:5,6,2,4,7,8,9,10,11;

第六次排序的结果为:5,2,4,6,7,8,9,10,11;

第七次排序的结果为:2,4,5,6,7,8,9,10,11;

第八次排序的结果为:2,4,5,6,7,8,9,10,11;这个第八步排序是必须的,最后还剩两个数之间的冒泡,这里正好是顺序,所以在这里显得有点多余,但是当时反序时,是必要的;

因为每一次排序都会将一个值冒泡出来,总共有n个数,当冒泡到第那个数时,还剩下最后一个数,这个数也就是这些数中的最值,所以最后一次排序也就没必要进行;即n个数的的冒泡排序。只需要进行n-1次冒泡;


二.程序部分

                          

//冒泡排序原理:
//就是通过n-1次的两两比较,将最大或者最小的数沉底(也就是所谓的冒泡).
#include<iostream>
#include<string>
#include<ctime>
using namespace std;

void Bubble_sort1(int a[],int n);
void Bubble_sort2(int a[], int n);
void Bubble_sort3(int a[], int n);
void mySwap(int &a, int &b);

int main()
{
    int a[] = { 5,2,4,3,1 };
    Bubble_sort3(a, 5);
    for (int i = 0; i < 5; i++)
        cout << a[i] << " ";

    system("pause");

}

//冒泡排序衍生品
void Bubble_sort1(int a[], int n)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = i + 1; j < n; j++)
        {
            if (a[i] > a[j])
            {
                mySwap(a[i], a[j]);
            }
        }
    }
}

//正宗的冒泡排序
void Bubble_sort2(int a[], int n)
{

    for (int i = 0; i < n-2; i++)
    {
        for (int j = 0; j < n-2-i; j++)
        {
            if (a[j] > a[j+1])
            {
                mySwap(a[j], a[j+1]);
            }
        }
    }
}

//优化的冒泡排序
void Bubble_sort3(int a[], int n)
{
    bool flag = true;
    for (int i = 0; i < n - 1&&flag; i++)
    {
        flag = false;
        for (int j = 0; j < n - 1-i; j++)
        {
            if (a[j] > a[j + 1])
            {
                mySwap(a[j], a[j + 1]);
                flag = true;
            }
        }
    }
}


//两个数的交换函数
void mySwap(int &a, int &b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
////}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值