Python十种排序算法

1. 冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

冒泡排序的时间复杂度为O(n^2),其中n是要排序的元素个数。

以下是一个Python实现冒泡排序的例子:

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

arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print("排序后的数组:")
for i in range(len(arr)):
    print("%d" %arr[i], end=" ")

输出结果为:

排序后的数组:
11 12 22 25 34 64 90

2. 选择排序(Selection Sort)

选择排序是一种简单的排序算法,它的基本思想是每次从未排序的元素中选择最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。选择排序是不稳定的排序方法。

以下是一个Python实现选择排序的例子:

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]

arr = [64, 34, 25, 12, 22, 11, 90]
selection_sort(arr)
print("排序后的数组:")
for i in range(len(arr)):
    print("%d" %arr[i], end=" ")

输出结果为:

排序后的数组:
11 12 22 25 34 64 90

3. 插入排序(Insertion Sort)

插入排序是一种简单的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

以下是一个Python实现插入排序的例子:

def insertion_sort(arr):
    n = len(arr)
    for i in range(1, n):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key

arr = [64, 34, 25, 12, 22, 11, 90]
insertion_sort(arr)
print("排序后的数组:")
for i in range(len(arr)):
    print("%d" %arr[i], end=" ")

输出结果为:

排序后的数组:
11 12 22 25 34 64 90

4. 希尔排序(Shell Sort)

希尔排序是一种基于插入排序的算法,通过将原始数据集分成若干个子序列,对子序列进行插入排序,然后逐步减小子序列的间隔,最后对整个数据集进行一次插入排序。希尔排序的时间复杂度为O(nlogn)。

以下是一个Python实现希尔排序的例子:

def shell_sort(arr):
    n = len(arr)
    gap = n // 2
    while gap > 0:
        for i in range(gap, n):
            temp = arr[i]
            j = i
            while j >= gap and arr[j - gap] > temp:
                arr[j] = arr[j - gap]
                j -= gap
            arr[j] = temp
        gap //= 2

arr = [64, 34, 25, 12, 22, 11, 90]
shell_sort(arr)
print("排序后的数组:")
for i in range(len(arr)):
    print("%d" %arr[i], end=" ")

输出结果为:

排序后的数组:
11 12 22 25 34 64 90

5. 归并排序(Merge Sort)

归并排序是一种基于分治思想的排序算法,它将待排序的序列分成若干个子序列,对每个子序列进行递归排序,然后将已有序的子序列合并成一个有序的序列。归并排序的时间复杂度为O(nlogn)。

以下是一个Python实现归并排序的例子:

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

def merge(left, right):
    result = []
    i = j = 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.extend(left[i:])
    result.extend(right[j:])
    return result

arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = merge_sort(arr)
print("排序后的数组:")
for i in range(len(sorted_arr)):
    print("%d" %sorted_arr[i], end=" ")

输出结果为:

排序后的数组:
11 12 22 25 34 64 90

6. 快速排序(Quick Sort)

快速排序是一种基于分治思想的排序算法,它通过选择一个基准元素将待排序序列划分成两个子序列,其中一个子序列的所有元素都比基准元素小,另一个子序列的所有元素都比基准元素大,然后对这两个子序列分别进行递归排序,最后将已有序的子序列合并成一个有序的序列。快速排序的平均时间复杂度为O(nlogn),最坏情况下的时间复杂度为O(n^2)。

以下是一个Python实现快速排序的例子:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = quick_sort(arr)
print("排序后的数组:")
for i in range(len(sorted_arr)):
    print("%d" %sorted_arr[i], end=" ")

输出结果为:

排序后的数组:
11 12 22 25 34 64 90

7. 堆排序(Heap Sort)

堆排序是一种基于二叉堆数据结构的排序算法,它通过将待排序序列构建成一个大顶堆(或小顶堆),然后将堆顶元素与堆尾元素交换,并将剩余的元素重新调整为大顶堆(或小顶堆),重复进行以上操作直到整个序列有序。堆排序的时间复杂度为O(nlogn)。

以下是一个Python实现堆排序的例子:

def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2
    if l < n and arr[i] < arr[l]:
        largest = l
    if r < n and arr[largest] < arr[r]:
        largest = r
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)
    return arr

arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = heap_sort(arr)
print("排序后的数组:")
for i in range(len(sorted_arr)):
    print("%d" %sorted_arr[i], end=" ")

输出结果为:

排序后的数组:
11 12 22 25 34 64 90

8. 计数排序(Counting Sort)

计数排序是一种基于桶排序思想的排序算法,它通过将待排序序列中的元素逐个放入一个固定大小的数组(称为“桶”)中,然后统计每个元素出现的次数,最后根据元素出现的次数依次将元素放回到原序列中。计数排序的时间复杂度为O(n+k),其中n为待排序序列的长度,k为序列中不同元素的个数。

以下是一个Python实现计数排序的例子:

def counting_sort(arr):
    max_val = max(arr)
    min_val = min(arr)
    range_of_elements = max_val - min_val + 1
    count = [0] * range_of_elements
    output = [0] * len(arr)

    for i in range(len(arr)):
        count[arr[i]-min_val] += 1

    for i in range(1, len(count)):
        count[i] += count[i-1]

    for i in range(len(arr)-1, -1, -1):
        output[count[arr[i] - min_val] - 1] = arr[i]
        count[arr[i] - min_val] -= 1

    for i in range(len(arr)):
        arr[i] = output[i]

    return arr

arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = counting_sort(arr)
print("排序后的数组:")
for i in range(len(sorted_arr)):
    print("%d" %sorted_arr[i], end=" ")

输出结果为:

排序后的数组:
11 12 22 25 34 64 90

9. 桶排序(Bucket Sort)

桶排序是一种基于分治思想的排序算法,它通过将待排序序列中的每个元素放入一个固定大小的桶中,然后对每个桶中的元素进行排序,最后将各个桶中的元素按顺序合并。桶排序的平均时间复杂度为O(n+k),其中n为待排序序列的长度,k为序列中不同元素的个数。

以下是一个Python实现桶排序的例子:

def bucket_sort(arr):
    if len(arr) == 0:
        return arr
    min_val, max_val = min(arr), max(arr)
    bucket_range = (max_val-min_val) / len(arr)
    count_list = [[] for _ in range(len(arr) + 1)]
    for i in range(len(arr)):
        count_list[int((arr[i] - min_val) // bucket_range)].append(arr[i])
    result = []
    for i in range(len(count_list)):
        if len(count_list[i]) > 0:
            insertion_sort(count_list[i])
            for j in range(len(count_list[i])):
                result.append(count_list[i][j])
    return result

def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and key < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key

arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = bucket_sort(arr)
print("排序后的数组:")
for i in range(len(sorted_arr)):
    print("%d" %sorted_arr[i], end=" ")

输出结果为:

排序后的数组:
11 12 22 25 34 64 90

10. 基数排序(Radix Sort)

基数排序是一种基于非比较整数排序的算法,它通过将待排序序列中的元素按照位数切割成不同的桶,然后对每个桶中的元素进行计数排序,最后根据每个元素的位数将各个桶中的元素按顺序合并。基数排序的时间复杂度为O(nk),其中n为待排序序列的长度,k为序列中不同元素的个数。

以下是一个Python实现基数排序的例子:

def counting_sort(arr, exp):
    n = len(arr)
    output = [0] * n
    count = [0] * 10

    for i in range(n):
        index = arr[i] // exp
        count[index % 10] += 1

    for i in range(1, 10):
        count[i] += count[i - 1]

    i = n - 1
    while i >= 0:
        index = arr[i] // exp
        output[count[index % 10] - 1] = arr[i]
        count[index % 10] -= 1
        i -= 1

    for i in range(n):
        arr[i] = output[i]

def radix_sort(arr):
    max_val = max(arr)
    exp = 1
    while max_val // exp > 0:
        counting_sort(arr, exp)
        exp *= 10

arr = [64, 34, 25, 12, 22, 11, 90]
radix_sort(arr)
print("排序后的数组:")
for i in range(len(arr)):
    print("%d" %arr[i], end=" ")

输出结果为:

排序后的数组:
11 12 22 25 34 64 90
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值