冒泡排序和递归排序

目录

一.冒泡排序

1.1概念:

1.2原理:

1.3简单示例讲解:

二.递归排序

1.1概念:

1.2原理:

1.3简单示例讲解:


一.冒泡排序

1.1概念:

冒泡排序是一种最基础的交换排序。

通过反复交换相邻两个元素的位置,使得每一轮循环都能将未排序的部分中的最大元素移动到数组的末尾。

因为越小的元素会经由交换像是气泡一样慢慢浮到数组的顶端,所以叫做冒泡排序。

1.2原理:

从数组的第一个元素开始,依次比较相邻的两个元素大小。

如果前面的元素比后面的元素大,就交换它们的位置,这样一轮比较下来,最大的元素就被交换到数组的最后一个位置了。

接下来,重复这个过程,有n个元素,就要重复n-1次,直到所有元素都被排序为止。

1.3简单示例讲解:

#定义一个数列,作为理解。ls=[9,5,2,7,6,4,1]
ls = [9,5,2,7,6,4,1]
for i in range(0,len(ls)-1):
    for j in rang(0,len(ls)-1):
        if ls[j] >= ls[j+1]:   
            ls[j],ls[j+1] = ls[j+1],ls[j]
print(ls)


#函数(作为初学者,要学会习惯用函数来进行分治解决)

def bubble_sort(ls):
    for i in range(len(ls)):
        for j in range(len(ls)):
            if ls[j] >= ls[j+1]:
                ls[j],ls[j+1] = ls[j+1],ls[j]
    return ls

首先,要获取数列的长度,可以用len()函数来解决,之后通过两个循环嵌套实现冒泡排序。外层循环用来遍历整个数组,内层循环则用来处理未排序的部分。

内循环中,比较两个相邻的元素大小,如果前一个元素比后一个元素大,那么就交换两个元素的位置。这样,每一轮遍历就能将未排序部分中的最大元素交换到数组的末尾。

达成排序的目的。

二.递归排序

1.1概念:

这里讲解的是一种最基础的递归排序。

递归,简而言之,就是函数自己调用自己。递归作为一种算法在程序设计语言中广泛应用。

递归是一个过程或函数在其定义或者说明中有直接或者间接调用自身的一种方法,通常把一个大的复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。

递归算法只需要少量的程序就能描述出解题过程中所需要的多次重复计算,大大的减少了程序的代码量。

1.2原理:

选择一个值作为key,再将key和其他数一一比较,比它大的放在原来的位置,比它小的数则和key互换位置,到最后实现数据大小的排序。

在这个问题中,我们可以将第一个元素作为key。

1.3简单示例讲解:

#定义一个函数,有三个参数,vect:待排序的序列,first:当前处理的起始位置,last:当前处理的结束位置(不包含)。

def resort(vect,first,last):
    if first == last:   #函数首先判断first=last,即起始位置等于结束位置,就输出当前列表
        print(vect)
    else:
        for i in range(first,last):
            Min = min (vect[first:last])
            index = vect.index(Min)#找到first到last范围内的最小值Min,并找到其索引index
            vect[first],vect[index] = vect[index],vect[first]#将第first个元素和最小值Min交换位置
            resort(vect,first+1,last)#调用resort函数,起始位置+1继续排列
            return vect


vect = [5,8,10,20,9,7,1]
resort(vect,0,len(vect))

在上述代码中,我们是直接在原来的数列上进行排序,存在一些问题,可以使用copy.deepcopy()来创建vect新副本,以此避免修改原始列表,以下是修正后的代码:

import copy

def resort(vect, first, last):
    if first == last:
        print(vect)
    else:
        for i in range(first, last):
            new_vect = copy.deepcopy(vect)  # 创建副本
            Min = min(new_vect[first:last])
            index = new_vect.index(Min)
            new_vect[first], new_vect[index] = new_vect[index], new_vect[first]
            
            resort(new_vect, first+1, last)

# 测试代码
vect = [5, 8, 10, 20, 9, 7, 1]
resort(vect, 0, len(vect))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值