【数据结构Python】排序算法

冒泡排序

data=[16,25,39,27,12,8,45,63]	# 原始数据
print('冒泡排序法:原始数据为:')
for i in range(8):
    print('%3d' %data[i],end='')
print()

for i in range(7,-1,-1): #扫描次数,从7到0,交换8次
    for j in range(i):
        if data[j]>data[j+1]:#比较,交换的次数
            data[j],data[j+1]=data[j+1],data[j]#比较相邻两数,如果第一数较大则交换

print('排序后的结果为:')
for j in range(8):
    print('%3d' %data[j],end='')
print()

选择排序

def showdata (data):
    for i in range(8):
        print('%3d' %data[i],end='')
    print()

def select (data):
    for i in range(7):
        for j in range(i+1,8):
            if data[i]>data[j]: #比较第i和第j个元素    比较的对象不一样
                data[i],data[j]=data[j],data[i]

data=[16,25,39,27,12,8,45,63]
print('原始数据为:')
showdata(data)
print('\n-------------------------------------')
select(data)
print("排序后的数据为:")
showdata(data)

快速排序

import random

def inputarr(data, size):
    for i in range(size):
        data[i] = random.randint(1, 100)

def showdata(data, size):
    for i in range(size):
        print('%3d' % data[i], end='')
    print()

def quick(d, size, lf, rg):
    # 第一项键值为d[lf]
    if lf < rg:  # 排序数列的左边与右边
        lf_idx = lf + 1
        while d[lf_idx] < d[lf]:
            if lf_idx + 1 > size:
                break
            lf_idx += 1
        rg_idx = rg
        while d[rg_idx] > d[lf]:
            rg_idx -= 1
        while lf_idx < rg_idx:
            d[lf_idx], d[rg_idx] = d[rg_idx], d[lf_idx]
            lf_idx += 1
            while d[lf_idx] < d[lf]:
                lf_idx += 1
            rg_idx -= 1
            while d[rg_idx] > d[lf]:
                rg_idx -= 1
        d[lf], d[rg_idx] = d[rg_idx], d[lf]

        for i in range(size):
            print('%3d' % d[i], end='')
        print()

        quick(d, size, lf, rg_idx - 1)  # 以rg_idx为基准点分成左右两半以递归方式
        quick(d, size, rg_idx + 1, rg)  # 分别为左右两半进行排序直至完成排序


def main():
    data = [0] * 100
    size = int(input('请输入数列的大小(100以下):'))
    inputarr(data, size)
    print('您输入的原始数据是:')
    showdata(data, size)
    print('排序的过程如下:')
    quick(data, size, 0, size - 1)
    print('最终的排序结果为:')
    showdata(data, size)


main()

基数排序

# 基数排序法,从小到大排序
import random

def inputarr(data,size):
    for i in range(size):
        data[i]=random.randint(0,999) #设置 data 值最大为 3 位数

def showdata(data,size):
    for i in range(size):
        print('%5d' %data[i],end='')
    print()

def radix(data,size):
     n=1 #n为基数,从个位数开始排序
     while n<=100:
        tmp=[[0]*100 for row in range(10)] # 设置暂存数组,[0~9位数][数据个数],所有内容均为0
        for i in range(size):    # 对比所有数据
            m=(data[i]//n)%10    # m为 n 位数的值,如 36 取十位数(36/10)%10=3
            tmp[m][i]=data[i]    # 把 data[i] 的值暂存在 tmp 中
        k=0
        for i in range(10):
            for j in range(size):
                if tmp[i][j] != 0:    # 因为一开始设置 tmp ={0},故不为 0 者即为
                    data[k]=tmp[i][j] # data 暂存在 tmp 中的值,把 tmp 中的值放
                    k+=1              # 回 data[ ]里
        print('经过%3d位数排序后:' %n,end='')
        showdata(data,size)
        n=10*n

def main():
    data=[0]*100
    size=int(input('请输入数列的大小(100以下):'))
    print('您输入的原始数据是:')
    inputarr (data,size)
    showdata (data,size)
    radix (data,size)

main()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值