冒泡排序、选择排序、快速排序

经典排序算法详解

冒泡排序、选择排序、快速排序

冒泡排序

冒泡排序的思想在于,不断地将当前元素与后一个元素进行比较,如果当前元素较小,则调换当前元素与后一个元素的位置,否则保持不变;假设需要排序的元素一共有n个,从第一个元素开始,对后续的(n-2)元素进行上述比较,最终的排序结果中,最后的元素是最大值。

def bubble_sort(alist):
    n = len(alist)
    for j in range(n-1):
        for i in range(n-1-j):
            if alist[i] > alist[i+1]:
                alist[i],alist[i+1] = alist[i+1],alist[i]

选择排序

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

算法步骤
1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

3.重复第二步,直到所有元素均排序完毕。

def select_sort(alist):
    n = len(alist)
    for j in range(n-1):
        min_index = j
        for i in range(j+1, n):
            if alist[min_index] > alist[i]:
                min_index = i
        alist[j], alist[min_index] = alist[min_index], alist[j]

快速排序

算法思想
快速排序的核心思想在于:首先在这个序列中随便找一个数作为基准数,然后将这个序列中所有比基准数大的数放在该数字的右边,比基准数小的数放在该数字的左边。第一轮排序结束之后,再分别对已经好的基准书左边(比基准数小)和基准书右边(比基准书大)的数字序列重复上述操作,用递归形式即可实现快速排序,完成对整个序列的排序。

算法步骤
为了清晰地展示快速排序的原理,这里使用一个例子来具体说明快速排序算法排序的过程。
假定现在要对数字序列 [4, 2, 7,8, 0,1, 5,23] 进行快速排序。
我们假设最左边的编号为i,最左边的编号为j,不失一般性,假定以4作为基准进行排序(每一次总总是让j先出发,向左移动,再让i出发,向右移动)。

(一)第一轮排序
j向左出发寻找第一个小于4的数,遇到1的时候停下来;i向右出发寻找第一个大于4的数,遇到7的时候停下来,交换两者的位置,数字序列变为
[4,2,1,8,0,7,5,23]
接下继续让j向左移动,寻找第二个小于4的数,遇到0的时候停下来;让i向右移动,寻找第二个大于4的数,遇到8的时候停下来,交换两者的位置,数字序列变为
[4,2,1,0,8,7,5,23]
此时发现i与j相遇了,第一轮排序结束,调换4和0的位置,数字序列变为
[0,2,1,4,8,7,5,23],
所有小于4的数字都在4的左边,所有大于4的数字都在4的右边。

(二)第二轮排序
分别对4左边和4右边的数字序列进行排序处理,首先对4左边的数字序列[0,2,1]排序。
以第一个数字0为基准,j向左出发寻找第一个小于0的数,i向右出发寻找第一个大于0的数,遇到0的时候停下来,如果找到就交换两者的位置,否则不变。数字序列变为[0,2,1],所有小于0的数字都在0的左边,所有大于0的数字都在0的右边。
再对4右边的数字序列[8, 7,5,23]排序。
以第一个数字8为基准,j向左出发寻找第一个小于8的数,遇到5的时候停下来;i向右出发寻找第一个大于8的数,如果找到就交换两者的位置,同时保证i小于j,那么数字序列变为[5,7,8,23]。所有小于8的数字都在8的左边,所有大于8的数字都在8的右边。
总体数字序列变为[0,2,1,4,5,7,8,23]。

(三)第三轮排序
好了动手算一算,类似第一和第二轮的排序方法,对0右边的数字序列进行排序,得到[0,1,2];对8左边的数字序列进行排序,得到[5,7,8,23]。第三轮排序结束。
得到最终的排序结果为
[0,1,2,4,5,7,8,23]。
快排过程结束。

def quick_sort(alist, first, last):
    if first >= last:
        return
    mid_value = alist[first]
    low = first
    high = last
    while low < high:
        # high 左移#
        while low < high and alist[high] >= mid_value:
            high -= 1
        alist[low] = alist[high]
        
        while low< high and alist[low] < mid_value:
            low += 1
        alist[high] = alist[low]
    #从循环退出时,low == high#
    alist[low] = mid_value
    #左边#
    quick_sort(alist, first, low-1)
    #右边
    quick_sort(alist, low+1 , last)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值