匠心精神 - 良心品质腾讯认可的专业机构-IT人的高薪实战学院

咨询电话:4000806560

Python常用的10种排序算法!

Python常用的10种排序算法!

排序算法是计算机科学中的经典问题,主要是指将一组无序的数据按照某种顺序重新排序的过程。排序算法是计算机程序中常见的一个操作,对于需要大量排序操作的场合,比如搜索引擎、数据库等系统,排序算法的性能直接影响到系统的运行效率和响应速度。在Python编程中,排序算法是很常见的操作,下面介绍Python常用的10种排序算法。

1. 冒泡排序

冒泡排序是一种简单的排序算法,其基本思想是:比较相邻的两个元素,将更大的元素交换到后面。这样一轮比较下来,最大的元素就会被交换到最后面。重复这个过程,依次将次大的元素依次交换到倒数第二个位置,倒数第三个位置......依次类推。

冒泡排序的Python代码示例:

```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]
```

2. 选择排序

选择排序也是一种简单的排序算法,其基本思想是:找出数组中最小的元素,将其放在第一位;接着再从剩余的元素中寻找最小的元素,将其放在第二位;以此类推,最终得到一个有序的数组。

选择排序的Python代码示例:

```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]
```

3. 插入排序

插入排序是一种简单而有效的排序算法,其基本思想是:将一个元素插入到已经排序好的序列中,使得插入后依然有序。插入排序的实现就是不断地将待排序元素插入到已经有序的序列中,直到所有元素都插入完毕。

插入排序的Python代码示例:

```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
```

4. 希尔排序

希尔排序是一种改进的插入排序算法,其基本思想是:将数组分成若干个较小的数组(步长为gap),对每个小数组进行插入排序,然后逐渐缩小gap的值,直到gap等于1。

希尔排序的Python代码示例:

```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 = gap // 2
```

5. 归并排序

归并排序是一种分治法的排序算法,其基本思想是:将待排序的数组分成两部分,对每一部分分别进行归并排序,然后将两个有序的子数组合并成一个有序的数组。

归并排序的Python代码示例:

```python
def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2
        left_arr = arr[:mid]
        right_arr = arr[mid:]
        merge_sort(left_arr)
        merge_sort(right_arr)
        i = j = k = 0
        while i < len(left_arr) and j < len(right_arr):
            if left_arr[i] < right_arr[j]:
                arr[k] = left_arr[i]
                i += 1
            else:
                arr[k] = right_arr[j]
                j += 1
            k += 1
        while i < len(left_arr):
            arr[k] = left_arr[i]
            i += 1
            k += 1
        while j < len(right_arr):
            arr[k] = right_arr[j]
            j += 1
            k += 1
```

6. 快速排序

快速排序是一种常用的排序算法,其基本思想是:选择一个基准值,将数组分成两部分,左边部分的所有元素小于基准值,右边部分的所有元素大于基准值,然后递归地对左右两边的部分进行排序。

快速排序的Python代码示例:

```python
def quick_sort(arr, left, right):
    if left < right:
        pivot = partition(arr, left, right)
        quick_sort(arr, left, pivot-1)
        quick_sort(arr, pivot+1, right)

def partition(arr, left, right):
    pivot = arr[right]
    i = left - 1
    for j in range(left, right):
        if arr[j] < pivot:
            i += 1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i+1], arr[right] = arr[right], arr[i+1]
    return i+1
```

7. 计数排序

计数排序是一种非比较排序算法,其基本思想是:通过对待排序数组中元素的计数来确定每个元素在排序后的位置。计数排序的时间复杂度为O(n+k),其中n为待排序数组的长度,k为待排序数组中最大值减去最小值的差。

计数排序的Python代码示例:

```python
def counting_sort(arr):
    min_val, max_val = min(arr), max(arr)
    count = [0] * (max_val - min_val + 1)
    for i in arr:
        count[i-min_val] += 1
    for i in range(1, len(count)):
        count[i] += count[i-1]
    res = [0] * len(arr)
    for i in range(len(arr)-1, -1, -1):
        res[count[arr[i]-min_val]-1] = arr[i]
        count[arr[i]-min_val] -= 1
    for i in range(len(arr)):
        arr[i] = res[i]
```

8. 桶排序

桶排序是一种非比较排序算法,其基本思想是:将待排序数组中的元素按照一定规则分配到不同的桶中,将每个桶中的数据进行排序,最后将所有桶中的数据按顺序依次排列。

桶排序的Python代码示例:

```python
def bucket_sort(arr, bucket_size=5):
    if len(arr) == 0:
        return []
    min_val, max_val = min(arr), max(arr)
    bucket_count = (max_val - min_val) // bucket_size + 1
    buckets = [[] for _ in range(bucket_count)]
    for i in arr:
        buckets[(i-min_val)//bucket_size].append(i)
    arr.clear()
    for i in range(bucket_count):
        buckets[i].sort()
        arr.extend(buckets[i])
    return arr
```

9. 基数排序

基数排序是一种非比较排序算法,其基本思想是:将待排序数组中的元素按照每一位的数值来进行排序,从低位到高位依次进行排序,最后得到一个完全有序的数组。

基数排序的Python代码示例:

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

def counting_sort_by_digit(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]
    for i in range(n-1, -1, -1):
        index = arr[i] // exp
        output[count[index % 10] - 1] = arr[i]
        count[index % 10] -= 1
    for i in range(n):
        arr[i] = output[i]
```

10. 堆排序

堆排序是一种常用的排序算法,其基本思想是:将待排序数组建立成一个堆,然后将堆的根节点取出并删除,得到一个有序的元素序列,对剩余的元素重新进行堆化操作,直到堆为空。

堆排序的Python代码示例:

```python
def heap_sort(arr):
    n = len(arr)
    for i in range(n, -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)

def heapify(arr, n, i):
    largest = i
    left = 2 * i + 1
    right = 2 * i + 2
    if left < n and arr[left] > arr[largest]:
        largest = left
    if right < n and arr[right] > arr[largest]:
        largest = right
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)
```

以上就是Python常用的10种排序算法,不同的排序算法适用于不同的情况,需要根据实际情况选择合适的算法来进行排序。