【算法】冒泡排序

概述

冒泡排序算法的核心是每次冒泡过程中,比较相邻的两个元素,如果array[i-1]大于array[i],则将其交换,然后array[i]和array[i+1]再进行比较,将大的元素往后放。这样一趟下来,最大元素就被逐次“冒”到序列的末尾了。

C语言代码

下面是C语言版本的冒泡排序函数:
void BubbleSort(int array[], int len)
{
    int i;
 
    while (len > 0)
    {
        for(i = 1; i < len; i++) //从array[1]开始比较,循环len-1-i次
        {
            if (array[i-1] > array[i]) //如果前一个大于后一个,则交换
                swap(&array[i - 1], &array[i]);
        }
        len--;
    }
}

while循环中,会循环len次,每执行循环一次len都会减1,因为已经得出了一个结果所以不用再比较。在每一次while循环中,都会执行len-1-i次for循环,每执行一次for循环都会比较array[i-1]和array[i]的大小,如果array[i-1]大于array[i],则交换。在第一趟while循环中,当i=len-1时,array[i-1]是倒数第二个元素,array[i]是最后一个元素。

时间复杂度

如果序列的长度为n,第一趟的冒泡需要的比较次数是n-1;第二趟冒泡比较时由于最后一个元素已经得出,不需要比较,所以第二趟冒泡的总比较次数是n-2,以此类推。第i次冒泡的比较次数是n-i。所以得出冒泡排序的时间复杂度是O(n^2)


Python代码

另外博主写了Pyhton版本的冒泡排序算法。

#FileName:BubbleSort.py
#Python Version:2.7.11
 
def BubbleSort(array,lenth):
    while lenth > 0:
        for i in range(1,lenth,1):
            if array[i-1] > array[i]:
                array[i],array[i-1] = array[i-1],array[i] #swap
        #print array
        lenth = lenth - 1
    return array
输出结果如下:
>>> sortTest = [9,8,7,6,5,4,3,2,1]
>>> BubbleSort(sortTest,9)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

C语言代码(完整版)

//BubbleSort.cpp : 定义控制台应用程序的入口点。
//IDE Version : VS2013
 
#include "stdafx.h"
 
void swap(int *a, int *b);
void BubbleSort(int array[], int len);
 
int _tmain(int argc, _TCHAR* argv[])
{
    int sortTest[9] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
 
    BubbleSort(sortTest, 9);
 
    for (int i = 0; i < 9; i++)
    {
        printf("%d ", sortTest[i]);     //输出1 2 3 4 5 6 7 8 9
    }
    printf("\n ");
    return 0;
}
 
//数据交换函数
void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
 
//冒泡排序函数
void BubbleSort(int array[], int len)
{
    int i;
 
    do
    {
        for (i = 1; i < len; i++)    //从array[1]开始比较,循环len-1-i次
        {
            if (array[i-1] > array[i])    //如果前一个大于后一个,则交换
                swap(&array[i - 1], &array[i]);
        }
    }while(len--);     //把while改成do...while
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值