排序是一种对一组数据按照某个特定的顺序进行排列的操作,常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等。
冒泡排序
冒泡排序是最简单的排序算法之一,它的基本思想是比较相邻的两个元素,如果前面的比后面的大,就交换这两个元素。这样一轮下来就可以把最大的元素放到最后面,接着再进行一轮比较就可以将次大的元素放到倒数第二个位置上,依次类推,直到排序完成。
冒泡排序的时间复杂度为 O(n^2),空间复杂度为 O(1)。
代码示例
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(n - i - 1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
插入排序
插入排序的思想是将未排序的元素逐个插入到已排序的序列中,这种排序方法类似于玩扑克牌时插牌的过程。插入排序的时间复杂度也为 O(n^2),但是对于基本有序的序列,插入排序的性能比冒泡排序更好。
代码示例
def insertion_sort(arr):
n = len(arr)
for i in range(1, n):
key = arr[i]
j = i - 1
while j >= 0 and arr[j] > key:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = key
return arr
选择排序
选择排序的思想是每次从未排序的元素中挑选一个最小的元素,放到已排序数组的末尾。选择排序每次需要扫描整个未排序序列,时间复杂度为 O(n^2),空间复杂度为 O(1)。
代码示例
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_index = i
for j in range(i+1, n):
if arr[j] < arr[min_index]:
min_index = j
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr
快速排序
快速排序是运用分治思想的一种排序算法,它的基本思想是选择一个基元(pivot),将原数组划分成左右两个子数组,使得左边的元素都小于基元,右边的元素都大于基元,递归地对左右两个子数组进行快速排序。
快速排序的时间复杂度为 O(nlogn),空间复杂度为 O(logn)。
代码示例
def quick_sort(arr, left=None, right=None):
if left is None:
left = 0
if right is None:
right = len(arr) - 1
if left >= right:
return arr
pivot = partition(arr, left, right)
quick_sort(arr, left, pivot-1)
quick_sort(arr, pivot+1, right)
return arr
def partition(arr, left, right):
pivot = arr[left]
while left < right:
while left < right and arr[right] >= pivot:
right -= 1
arr[left] = arr[right]
while left < right and arr[left] <= pivot:
left += 1
arr[right] = arr[left]
arr[left] = pivot
return left
归并排序
归并排序是一种基于分治思想的排序算法,它的基本思想是将数组分成两个子数组,分别排序,然后将排好序的子数组合并成一个有序的数组。归并排序也是一种稳定排序算法,它的时间复杂度为 O(nlogn),空间复杂度为 O(n)。
代码示例
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left_arr = merge_sort(arr[:mid])
right_arr = merge_sort(arr[mid:])
return merge(left_arr, right_arr)
def merge(left_arr, right_arr):
left_index, right_index = 0, 0
result = []
while left_index < len(left_arr) and right_index < len(right_arr):
if left_arr[left_index] <= right_arr[right_index]:
result.append(left_arr[left_index])
left_index += 1
else:
result.append(right_arr[right_index])
right_index += 1
result += left_arr[left_index:]
result += right_arr[right_index:]
return result
堆排序
堆排序采用堆的思想来进行排序,构建一个最大堆或最小堆,然后逐个从堆中取出元素,就得到了一个有序的序列。堆排序的时间复杂度为 O(nlogn),空间复杂度为 O(1)。
代码示例
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[0], arr[i] = arr[i], arr[0]
heapify(arr, i, 0)
return arr
def heapify(arr, n, i):
largest = i
left_child = i * 2 + 1
right_child = i * 2 + 2
if left_child < n and arr[left_child] > arr[largest]:
largest = left_child
if right_child < n and arr[right_child] > arr[largest]:
largest = right_child
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
总结
以上是一些基本的排序算法以及它们的代码实现,每个算法都有自己的特点和适用范围,选择一种合适的排序算法可以提高算法效率。在实际的开发中,除了自行实现算法外,还可以使用现成的排序函数,例如Python中的sort()函数,可以方便快捷地完成排序操作。