python 数据结构之:排序

python 数据结构之:排序

1 冒泡排序

  • 相邻元素两两比较,大的往后放。第一次完毕后,最大值就出现在了最大索引处。同理,再执行,即可得到一个排好序的数组。

  • 冒泡排序基础原理:

    def sort(li):
        """
        将无序列表中最大数移动到最后
        :param li:
        :return:
        """
        for i in range(len(li) - 1):
            if li[i] > li[i + 1]:
                li[i], li[i + 1] = li[i + 1], li[i]
        return li
    
    
    alist = [1, 6, 7, 3, 5]
    print(sort(alist))
    
  • 实现代码:

    def sort2(li):
        for j in range(len(li) - 1):
            # 每将无序列表最大数移动到最后一次,内层循环都会少一次
            for i in range(len(li) - 1 - j):
                if li[i] > li[i + 1]:
                    li[i], li[i + 1] = li[i + 1], li[i]
        return li
    
    
    alist = [1, 6, 7, 3, 5]
    print(sort2(alist))
    
    

2 选择排序

  • 选择排序改进了冒泡排序,每次遍历列表只做一次交换。为了做到这一点,一个选择排序在他遍历时寻找最大的值,并在完成遍历后,将其放置在正确的位置。

  • 选择排序基础原理

    def sort(li):
        """
        每一次遍历,都将列表最大值位置与最后一位元素替换
        :param li:
        :return:
        """
        max_index = 0
        for i in range(len(li) - 1):
            if li[i] > li[max_index]:
                max_index = i
        li[max_index], li[len(li) - 1] = li[len(li) - 1], li[max_index]
        return li
    
    
    alist = [1, 6, 7, 3, 5]
    print(sort(alist))
    
    
  • 实现代码:

    def sort2(li):
        for j in range(len(li) - 1):
            max_index = 0  # 当前选择排序中最大值下标
            for i in range(1, len(li) - j):
                if li[i] > li[max_index]:
                    max_index = i
            li[max_index], li[len(li) - 1 - j] = li[len(li) - 1 - j], li[max_index]
        return li
    
    
    alist = [1, 6, 7, 3, 5]
    print(sort2(alist))
    
    

3 插入排序

  • 插入排序的主要思想是每次取一个列表元素与列表中已经排序好的列表段进行比较,然后插入从而得到新的排序好的列表段,最终获得排序好的列表。

  • 以无序列表中第一个元素作为已经排序好的有序列表,每次插入,有序列表长度加1,无序列表长度减1。

  • 代码实现:

    def sort(li):
        """
        插入排序
        i 作为有序元素列表的长度,默认为0,即当li列表中的第一个元素作为有序元素列表;
        当i=1时,比较第1个元素与第2个元素的大小,调整两个元素之间的位置,有序元素列表的长度+1
        if li[i] < li[i - 1]:
            li[i], li[i - 1] = li[i - 1], li[i]
    
        当 i=2 时,li列表中的第3个元素需要与前两个有序元素进行比较
        while i>0:
            if li[i] < li[i - 1]:
                li[i], li[i - 1] = li[i - 1], li[i]
                i -= 1
            else:
                break
        :param li:
        :return:
        """
        for i in range(1, len(li)):
            while i > 0:
                if li[i] < li[i - 1]:
                    li[i], li[i - 1] = li[i - 1], li[i]
                    i -= 1
                else:
                    break
        return li
    
    
    alist = [1, 6, 7, 3, 5]
    print(sort(alist))
    

4 希尔排序

  • 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量(gap)”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高。

  • 实现代码:

    def sort(li):
        """
        希尔排序,插入排序为希尔排序的特殊案例。
        :param li:
        :return:
        """
        gap = len(li) // 2
        while gap >= 1:
            for i in range(gap, len(li)):
                if li[i] < li[i - gap]:
                    li[i], li[i - gap] = li[i - gap], li[i]
            gap //= 2
        return li
    
    
    alist = [1, 6, 7, 3, 5]
    print(sort(alist))
    
    

5 快速排序

  • 将列表中第一个元素设定为基准数字,赋值给mid变量,然后将整个列表中比基准小的数值放在基准的左侧,比基准到的数字放在基准右侧。然后将基准数字左右两侧的序列在根据此方法进行排放。

  • 定义两个指针,low指向最左侧,high指向最右侧

  • 然后对最右侧指针进行向左移动,移动法则是,如果指针指向的数值比基准小,则将指针指向的数字移动到基准数字原始的位置,否则继续移动指针。

  • 如果最右侧指针指向的数值移动到基准位置时,开始移动最左侧指针,将其向右移动,如果该指针指向的数值大于基准则将该数值移动到最右侧指针指向的位置,然后停止移动。

  • 如果左右侧指针重复则,将基准放入左右指针重复的位置,则基准左侧为比其小的数值,右侧为比其大的数值。

  • 代码实现:

    def sort(li, start, end):
        low = start
        high = end
        if low > high:
            return
        mid = li[start]
        while low < high:
            # # 偏移high
            while low < high:
                if li[high] < mid:
                    li[low] = li[high]
                    break
                else:
                    high -= 1
            # 偏移low
            while low < high:
                if li[low] > mid:
                    li[high] = li[low]
                    break
                else:
                    low += 1
            if low == high:
                li[low] = mid
                break
        # 作用到左侧
        sort(li, start, high - 1)
        # 作用到右侧
        sort(li, low + 1, end)
        return li
    
    
    alist = [4, 6, 1, 3, 5]
    print(sort(alist, 0, len(alist) - 1))
    
    
posted @ 2023-07-08 10:24  f_carey  阅读(27)  评论(0编辑  收藏  举报