排序
排序分为内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。
注:以下所有排序均是从小到大排
1.冒泡排序
思路
循环n-1次,每次循环比较前n-i个元素,i为当前循环的次数。
依次遍历要比较的n-i个元素,如果当前第j个元素比第j+1个元素大,就交换他们两个。
j从0开始,到n-i-1结束。
代码实现
def bubbleSort(arr):
for i in range(1, len(arr)):
for j in range(0, len(arr)-i):
if arr[j] > arr[j+1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
return arr
2.选择排序
思路
循环n-1次,每次循环比较后n-i个元素,i为当前循环的次数。
遍历后n-i个元素,将它们依次与arr[i]比较,如果当前第j个元素比arr[i]小,交换它们的位置。
代码实现
def selectionSort(arr):
for i in range(len(arr) - 1):
# 记录最小数的索引
minIndex = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[minIndex]:
minIndex = j
# i 不是最小数时,将 i 和最小数进行交换
if i != minIndex:
arr[i], arr[minIndex] = arr[minIndex], arr[i]
return arr
3.插入排序
思路
循环遍历整个数组,将当前元素依次与前面的元素比较,如果前面的元素大于当前元素,则将前面的元素后移一位,一直到前面的元素不再大于当前元素,将当前元素挪到前面的元素后一位。
代码实现
def insertionSort(arr):
for i in range(len(arr)):
preIndex = i-1
current = arr[i]
while preIndex >= 0 and arr[preIndex] > current:
arr[preIndex+1] = arr[preIndex]
preIndex-=1
arr[preIndex+1] = current
return arr
4.希尔排序
思路
在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
然后逐渐将增量减小,并重复上述过程。
希尔排序是插入排序的改进版本,插入排序每次比较后移一位,希尔排序每次比较后移与增量大小一样的位数。
增量初始选择len(arr)//3+1,然后增量逐渐减小,直至为1。每选择一个增量,进行一次插入排序
插入排序可以看作是增量为1的希尔排序。
代码实现
def shellSort(arr):
import math
gap=1
while(gap < len(arr)/3):
gap = gap*3+1
while gap > 0:
for i in range(gap,len(arr)):
temp = arr[i]
j = i-gap
while j >=0 and arr[j] > temp:
arr[j+gap]=arr[j]
j-=gap
arr[j+gap] = temp
gap = math.floor(gap/3)
return arr
5.归并排序
思路
归并排序分为自上而下的递归和自下而上的迭代两种实现方式,这里介绍递归的实现。
归并排序分为两个过程,分解和合并
首先是分解,将待排序数组均分为两组,再将分出来的两组数据各自分为两组,依次类推,直到分出来的小组只有1个数据ÿ