欢迎访问宙启技术站
智能推送

如何用Python编写一个列表排序函数

发布时间:2023-05-29 05:37:03

在Python中,有多种方法可以实现列表排序。可以使用内置的排序函数或手动实现排序算法。这篇文章将介绍使用Python编写一个简单的列表排序函数的过程,同时也会介绍一些常见的排序算法。

由于Python已经内置了排序函数,因此我们可以先通过它来快速对列表进行排序:

my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
my_list.sort()
print(my_list)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

可以看到,sort()函数已经将列表按升序进行了排序。但是,这并不是我们要编写的排序函数。因此,我们需要手动实现一个排序函数。

常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序等。下面,我们将以冒泡排序为例,介绍如何用Python编写一个列表排序函数。

冒泡排序算法的基本思想是,从列表的 个元素开始,依次比较相邻的元素,如果前一个元素比后一个元素大,则交换它们的位置。这样一遍遍地进行比较和交换,直到整个列表都排完序为止。冒泡排序的时间复杂度为O(n^2)。

以下是使用Python实现冒泡排序的代码:

def bubble_sort(lst):
    n = len(lst)
    # 遍历每一个元素
    for i in range(n):
        # 比较相邻的元素
        for j in range(0, n-i-1):
            if lst[j] > lst[j+1]:
                # 交换元素位置
                lst[j], lst[j+1] = lst[j+1], lst[j]

# 测试排序函数
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
bubble_sort(my_list)
print(my_list)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

在实现了冒泡排序函数后,我们可以根据需要对其进行修改和扩展。例如,为了实现降序排序,只需要将比较运算符从“>”改为“<”即可。如果要排序的是字符串或其他类型的数据,需要修改比较运算符和进行类型转换等。

除了冒泡排序,我们还可以使用其他的排序算法实现列表排序。例如:

选择排序:每次遍历列表,从中选择一个最小的元素,放到已排序的子列表末尾。时间复杂度为O(n^2)。

def selection_sort(lst):
    n = len(lst)
    for i in range(n):
        min_index = i
        # 找到子列表中最小的元素
        for j in range(i+1, n):
            if lst[j] < lst[min_index]:
                min_index = j
        # 将最小元素放到已排序的子列表末尾
        lst[i], lst[min_index] = lst[min_index], lst[i]

# 测试排序函数
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
selection_sort(my_list)
print(my_list)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

插入排序:将列表分为已排序和未排序两部分,每次从未排序部分取出一个元素,插入到已排序部分的适当位置。时间复杂度为O(n^2)。

def insertion_sort(lst):
    n = len(lst)
    for i in range(1, n):
        key = lst[i]
        j = i - 1
        # 查找插入位置
        while j >= 0 and lst[j] > key:
            lst[j+1] = lst[j]
            j -= 1
        lst[j+1] = key

# 测试排序函数
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
insertion_sort(my_list)
print(my_list)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

快速排序:选择一个枢纽元素,将列表分为两部分,一部分比枢纽元素小,一部分比枢纽元素大,递归地对这两部分进行快速排序。时间复杂度为O(n*logn)。

def quick_sort(lst):
    if len(lst) <= 1:
        return lst
    else:
        pivot = lst[0]
        left = [x for x in lst[1:] if x <= pivot]
        right = [x for x in lst[1:] if x > pivot]
        return quick_sort(left) + [pivot] + quick_sort(right)

# 测试排序函数
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
my_list = quick_sort(my_list)
print(my_list)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

归并排序:将列表不断分成两半,递归地对每一半进行排序,然后将排好序的两半合并起来。时间复杂度为O(n*logn)。

def merge(left, right):
    result = []
    i, j = 0, 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

def merge_sort(lst):
    if len(lst) <= 1:
        return lst
    else:
        mid = len(lst) // 2
        left = merge_sort(lst[:mid])
        right = merge_sort(lst[mid:])
        return merge(left, right)

# 测试排序函数
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
my_list = merge_sort(my_list)
print(my_list)  # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

以上就是几种常见的排序算法以及如何用Python实现它们的代码。实际上,Python还内置了许多其他的排序算法,例如堆排序、计数排序、基数排序等。在实际应用中,应该根据具体情况选择合适的排序算法,以提高算法的效率和性能。