python 与数据结构--冒泡排序

python这样简洁的语言,内置了很多排序、队列、集合等方法,使得算法什么的没那么重要。但是用python来实现以前学过的算法,也是乐趣,简洁的语法更加容易的理解算法.

python语法相关知识可以参考:

[ python 基础教程]

冒泡排序:

1.排序方法
将被排序的数组a[n]垂直排列,每个记录看作是重量为a[i]的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组a。凡扫描到违反本原则的轻气泡,就使其向上”飘浮”。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
(1)初始状态
a[0..n]为无序区。
(2)第一趟扫描
从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较 (a[n],a[n-1]),(a[n-1],a[n-2]),…,(a [1 ],a[0]);对于每对气泡(a[j+1],a[j]),若a[j+1] < a[j],则交换a[j+1] < a[j]的内容。
第一趟扫描完毕时,”最轻”的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置a[0]上。
(3)第二趟扫描
扫描a[1..n]。扫描完毕时,”次轻”的气泡飘浮到a[ 1]的位置上……
最后,经过n-1 趟扫描可得到有序区a[0..n]
注意:
第i趟扫描时,a[0..i-1]和a[ i..n]分别为当前的有序区和无序区。扫描仍是从无序区底部向上直至该区顶部。扫描完毕时,该区中最轻气泡飘浮到顶部位置a[i]上,结果是a[0..i]变为新的有序区。

python 实现代码

# -*-coding:utf-8 -*-
'''
Created on 2016年3月2日
@author: wupengyue@126.com
'''

def BubbleSort(mylist):
    '''列表冒泡排序'''
    length=len(mylist)
    for i in range(length):
        exchange=False #交换标志 
        for j in range(length-1,i,-1):
            if mylist[j]<mylist[j-1]:
                temp=mylist[j]
                mylist[j]=mylist[j-1]
                mylist[j-1]=temp
                exchange=True  #发生了交换,故将交换标志置为真
            if not exchange:
                return 
    for x in mylist:
        print x



if __name__=='__main__':
    a=[12,3,4,56,78,90,56]
    BubbleSort(a)
    print a

C 实现代码

/*
Created on 2016年3月2日
@author: wupengyue@126.com
*/
#include <stdio.h>
typedef int bool;
#define false 0
#define true 1
void BubbleSort(int a[],int n);

int main()
{
    int a[8]={49,38,65,97,76,13,27,49};
    int i;
    int n=sizeof(a)/sizeof(a[0]);
    for (i=0;i<n;i++)
    {
        printf("%d \t",a[i]);
    }
    printf("\n");

    BubbleSort(a,n);

    for (i=0;i<n;i++)
    {
        printf("%d \t",a[i]);
    }
    printf("\n");
    return 0;
}

void BubbleSort(int R[],int n)
{
    int i,j;
    int temp;
    bool exchange=false;
    for (i=0;i<n;i++)
    {
        for (j=n-1;j>i;j--)
        {
            if (R[j]<R[j-1])
            {
                temp=R[j];
                R[j]=R[j-1];
                R[j-1]=temp;
                exchange=true;
            }


        }
        if (!exchange)
            return ; 

    }
    return ;

}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值