图解算法 -使用Python 学习笔记(3)

2023-11-09

图解算法 -使用Python 学习笔记(3)

排序算法

3.1认识排序
用以排序的依据是键,它所含的值被称为“键值”。通常键值的数据类型有数值类型、中文字符串以及非中文字符串三种。其中中文字符串用该中文内码,如中文繁体BIG5码、中文简体GB码,非中文的用ASCII码来进行比较。
在排序过程中,数据的移动方式可分为“直接移动”和“逻辑移动”两种。这当中逻辑移动不会移动数据存储的位置,尽改变指向这些数据的辅助指针的值。
3.2冒泡排序

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):#扫描次数
    for j in range(i):
        if data[j]>data[j+1]:#比较,交换的次数
            data[j],data[j+1]=data[j+1],data[j]#比较相邻两数,如果第一个数较大则交换
    print('第%d次排序的结果是:'%(8-i),end='')#把各次扫描后的结果打印出来
    for j in range(8):
        print('%3d'%data[j],end='')
    print()
print ('排序后的结果为:')
for j in range(8):
    print('%3d' % data[j], end='')
print()

3.3选择排序

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]
    print()


data = [16, 25, 39, 27, 13, 8, 45, 63]
print('原始数据:')
for i in range(8):
    print('%3d' % data[i], end='')
print('\n-----------------')
select(data)
print('排序后的数据为:')
for i in range(8):
    print('%3d' % data[i], end='')
print('')

3.4插入排序

SIZE = 8  # 定义数组大小


def showdata(data):
    for i in range(8):
        print('%3d' % data[i], end='')  # 用来打印数组数据
    print()


def insert(data):
    for i in range(1, SIZE):
        tmp = data[i]  # 暂存数据
        no = i - 1
        while no >= 0 and tmp < data[no]:
            data[no + 1] = data[no]  # 就把所有元素往后推一位
            no -= 1
        data[no + 1] = tmp  # 最小的元素放在第一位


def main():
    data = [16, 25, 39, 27, 13, 8, 45, 63]
    print('原始数据:')
    showdata(data)
    insert(data)
    print('排序后的数据为:')
    showdata(data)


main()

3.5希尔排序

SIZE = 8  # 定义数组大小


def showdata(data):
    for i in range(8):
        print('%3d' % data[i], end='')  # 用来打印数组数据
    print()


def shell(data, size):
    k = 1  # k打印次数
    jmp = size // 2
    while jmp != 0:
        for i in range(jmp, SIZE):  # i为扫描次数,jmp为设置间距的位移量
            tmp = data[i]  # tmp用来暂存数据
            j = i - jmp  # 以j来定位比较的元素
            while tmp < data[j] and j >= 0:  # 插入排序法
                data[j + jmp] = data[i]
                j = j - jmp
            data[jmp + j] = tmp
        print('第%d次排序过程' % k, end='')
        k += 1
        showdata(data)
        print('-----------------')
        jmp = jmp // 2  # 控制循环次数


def main():
    data = [16, 25, 39, 27, 13, 8, 45, 63]
    print('原始数据:')
    showdata(data)
    print('\n-----------------')
    shell(data, SIZE)


main()

3.6合并排序

# 合并排序法(Merge Sort)

#99999为数列1的结束数字不列入排序
list1 = [20,45,51,88,99999]
#99999为数列2的结束数字不列入排序
list2 = [98,10,23,15,99999] 
list3 = []

def merge_sort():
    global list1
    global list2
    global list3
        
    # 先使用选择排序将两个数列排序,再进行合并
    select_sort(list1, len(list1)-1)
    select_sort(list2, len(list2)-1)

    
    print('\n第1个数列的排序结果为: ', end = '')
    for i in range(len(list1)-1):
        print(list1[i], ' ', end = '')

    print('\n第2个数列的排序结果为: ', end = '')
    for i in range(len(list2)-1):
        print(list2[i], ' ', end = '')
    print()

    for i in range(60):
        print('=', end = '')
    print()

    My_Merge(len(list1)-1, len(list2)-1)

    for i in range(60):
        print('=', end = '')
    print()

    print('\n合并排序法的最终结果为: ', end = '')
    for i in range(len(list1)+len(list2)-2):
        print('%d ' % list3[i], end = '')
        
def select_sort(data, size):
    for base in range(size-1):
        small = base
        for j in range(base+1, size):
            if data[j] < data[small]:
                small = j
        data[small], data[base] = data[base], data[small]

def My_Merge(size1, size2):
    global list1
    global list2
    global list3

    index1 = 0
    index2 = 0
    for index3 in range(len(list1)+len(list2)-2):
        if list1[index1] < list2[index2]: # 比较两个数列,数小的先存于合并后的数列
            list3.append(list1[index1])
            index1 += 1
            print('此数字%d取自于第1个数列' % list3[index3])
        else:
            list3.append(list2[index2])
            index2 += 1
            print('此数字%d取自于第2个数列' % list3[index3])
        print('目前的合并排序结果为: ', end = '')
        for i in range(index3+1):
            print(list3[i], ' ', end = '')
        print('\n')

#主程序开始

merge_sort()  #调用所定义的合并排序法函数

3.7快速排序法

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()

3.8基数排序法

# 基数排序法,从小到大排序
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()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图解算法 -使用Python 学习笔记(3) 的相关文章

随机推荐

  • Linux中部署Spring Cloud项目

    Linux中部署Spring Cloud项目 文章为本人在学习的过程中 记录部署过程 仅供参考学习 因本人经验不足 教程或有不妥之处 还望指正 保姆级教程 敬请食用 简介 在学习过程中 部署时使用的项目是一个个人学习项目 若您喜欢 也可点击
  • Linux-压缩命令

    目录 1 tar 1 1 压缩 tar gz tar bz2 tgz 1 2 解压缩 tar gz tar bz2 tgz 2 zip 2 1 压缩 zip 2 2 解压缩 zip 3 rar 3 1 压缩 rar 3 2 解压缩 rar
  • 强大性能分析工具JVisualVM

    JVisualVM是由Sun提供的性能分析工具 如此强大的后盾怎能不强大 在Jdk6 0以后的版本中是自带的 配置好环境变量然后在运行中输入 JVisualVm 或直接到Jdk的安装目录的Bin目录下找到运行程序即可运行 如果是用Jdk1
  • 静态测试 动态测试 白盒测试的优缺点

    静态分析是一种不通过执行程序而进行测试的技术 静态分析的关键功能是检查软件的表示和描述是否一致 没有冲突或者没有歧义 动态分析的主要特点是当软件系统在模拟的或真实的环境中执行之前 之中和之后 对软件系统行为的分析 动态分析包含了程序在受控的
  • C语言 字母大小互相转换 三种思路

    1 利用ASCII值方法 大小写相差32 方法 1 include
  • maven在Win10的安装和配置

    1 下载和安装maven 一 下载Maven并解压 1 Maven官网下载地址 http maven apache org download cgi 2 下载后解压 将Maven的压缩包解压到 E Java apache maven 3 6
  • 【Unity2D入门教程】简单制作一个弹珠游戏之制作场景①(开场,结束,板子,球)

    学习目标 看过我前面的文章应该知道怎么制作开头和结尾 这里我简单把效果给大伙看一下 我用的游戏分辨率是4 3 因此我们要改变Canvas的的Cavans Scale为X1440 Y1080 结束的场景也一样 接着我们编写一个脚本来管理场景的
  • 基于人工势场算法机器人避障路径规划

    基于人工势场算法机器人避障路径规划 人工势场算法是一种热门的机器人路径规划算法 其通过建立虚拟的 势场 使得机器人在避障时能够像物理学中的粒子一样受到 势 的作用 最终实现自主导航 本文将介绍如何使用 MATLAB 实现基于人工势场算法的机
  • mac中的IDEA的使用快捷键

    1 command F 在当前文件进行文本查找 2 command shift F 进行工程和模块中的文件搜索 3 command u 找到这个方法的接口 4 command option commad 找到这个接口的实现类 5 comma
  • javascript中做减法时,出现小数位增加bug

    这个bug是js固有的 浮点数精度不准 你可以用下面方法来解决 思路是先放大 求和 差 积等运算后再缩小 如 加法函数 用来得到精确的加法结果 说明 javascript的加法结果会有误差 在两个浮点数相加的时候会比较明显 这个函数返回较为
  • JPEG编码原理及文件格式及代码分析

    一 JPEG编码原理 首先我们先来看一下JPEG的编码原理图 如上图所示 下面进行逐步的分析 1 RGB gt YUV 首先为了降低互相的关联性 将RGB转换为YUV 这样就可以对亮度信号和色度信号进行分别的处理 2 零电平偏置下移 由于后
  • CreateEvent函数在多线程中使用及实例

    HANDLE CreateEvent LPSECURITY ATTRIBUTES lpEventAttributes BOOL bManualReset BOOL bInitialState LPCSTR lpName bManualRes
  • 8.7.1 makefile实例——项目中的总makefile

    Linux C程序设计王者归来 第8章构建makefile文件 makefile相当于一种脚本编程语言 用户在编写makefile的过程中可以使用变量 控制结构语句和函数等一般编程语言的特性 同时也可以执行shell指令 makefile诞
  • 2021年前端关注的8个技术趋势

    2020年也过去 我们一起解读一下整个2020年的前端技术的8个技术 并深度分析2021年大前端领域又有哪些顶级技术趋势 你不容错过 2020年注定是不平凡的一年 相信因为疫情很多程序员的工作和生活都受到了一定影响 其实现在前端的技术已经到
  • Minio控制台详细教程

    前言 此文讲解Minio控制台详细教程 可能会涉及到有些知识大家可能不懂情况 需要知道Minio兼容的是AMS S3对象存储服务 需要知道AMS S3对象存储服务是什么 里面涉及的到配置如何去配等等 https docs aws amazo
  • PHP html table下载为excel

    php下载头 header Content type application vnd ms excel header Content Disposition attachment filename test xls header Conte
  • 进程管理与内存管理

    谷歌官网 内存管理概览
  • STM32之RTC

    简介 STM32 的实时时钟 RTC 是一个独立的定时器 STM32 的 RTC 模块拥有一组连续计数的计数器 在相应软件配置下 可提供时钟日历的功能 修改计数器的值可以重新设置系统当前的时间和日期 框图 相关寄存器 控制寄存器 第 0 位
  • 网页的内联框架

    内联 网页里嵌套网页
  • 图解算法 -使用Python 学习笔记(3)

    图解算法 使用Python 学习笔记 3 排序算法 3 1认识排序 用以排序的依据是键 它所含的值被称为 键值 通常键值的数据类型有数值类型 中文字符串以及非中文字符串三种 其中中文字符串用该中文内码 如中文繁体BIG5码 中文简体GB码