当我们提到排序算法的时候,常常会将其分为两类:稳定排序算法和非稳定排序算法。稳定排序算法是指在排序过程中,具有相同关键字的记录,排序后仍然保持排序前的先后顺序。稳定排序算法相对于非稳定排序算法有更为明显的优势,例如可以保留有先后顺序相关的信息,方便后续的处理。
下面让我们来详细讲解稳定排序算法的使用方法和实现。
稳定排序算法的分类
通常使用的稳定排序算法包括冒泡排序、插入排序、归并排序和基数排序等。接下来对这几种算法进行一一讲解。
冒泡排序
冒泡排序是一种简单的排序算法,算法思想是将要排序的数据按照大小进行比较,并根据比较结果交换它们的位置,使较小或较大的元素逐渐“冒泡”到数列的顶端。这个过程类似于水中的气泡从深处升至水面。
以下是冒泡排序的Python实现代码:
def bubbleSort(arr):
n = len(arr)
# 遍历所有数组元素
for i in range(n):
# 最后 i 个元素已经排好序了
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]
bubbleSort(arr)
print("排序后的数组:")
for i in range(len(arr)):
print("%d" %arr[i])
插入排序
插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序数列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置后插入。
以下是插入排序的Python实现代码:
def insertionSort(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 = [12, 11, 13, 5, 6]
insertionSort(arr)
print ("排序后的数组:")
for i in range(len(arr)):
print ("%d" %arr[i])
归并排序
归并排序是一种分而治之的算法,它将原始数组划分成较小的数组,直到每个小数组都可以由单个元素排序。然后,排序过程发生在合并相邻的小数组时,直到合并回原始数组的单个数组为止。
以下是归并排序的Python实现代码:
def mergeSort(arr):
if len(arr) > 1:
# Divide the array into two halves
mid = len(arr)//2
leftArray = arr[:mid]
rightArray = arr[mid:]
# Recursively sort both halves
mergeSort(leftArray)
mergeSort(rightArray)
# Merge the halves
i = j = k = 0
while i < len(leftArray) and j < len(rightArray):
if leftArray[i] < rightArray[j]:
arr[k] = leftArray[i]
i += 1
else:
arr[k] = rightArray[j]
j += 1
k += 1
while i < len(leftArray):
arr[k] = leftArray[i]
i += 1
k += 1
while j < len(rightArray):
arr[k] = rightArray[j]
j += 1
k += 1
arr = [38, 27, 43, 3, 9, 82, 10]
mergeSort(arr)
print("排序后的数组:")
for i in range(len(arr)):
print("%d" %arr[i])
基数排序
基数排序是一种非比较型整数排序算法,它的原理是根据数位来排序,比较适用于位数较少的数列排序。
以下是基数排序的Python实现代码:
def radixSort(arr):
maxNumber = max(arr)
currPosition = 1
while maxNumber / currPosition > 0:
countingSort(arr, currPosition)
currPosition *= 10
def countingSort(arr, currPosition):
output = [0] * len(arr)
count = [0] * 10
for i in range(len(arr)):
index = arr[i] // currPosition
count[index % 10] += 1
for i in range(1, 10):
count[i] += count[i - 1]
i = len(arr) - 1
while i >= 0:
index = arr[i] // currPosition
output[count[index % 10] - 1] = arr[i]
count[index % 10] -= 1
i -= 1
i = 0
for i in range(0, len(arr)):
arr[i] = output[i]
arr = [170, 45, 75, 90, 802, 24, 2, 66, 550]
radixSort(arr)
print("排序后的数组:")
for i in range(len(arr)):
print("%d" %arr[i])
总之,稳定排序算法有很多,我们可以根据算法复杂度有所区分,选择最适合自己的算法。