python 实现排序算法
一、冒泡排序
原理:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。
def bubble_sort(data):
for i in range(len(data)-1):
for j in range(len(data)- i -1):
if data[j]<data[j + 1]:
data[j], data[j + 1] = data[j + 1], data[j]
二、插入排序
原理:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序。
def insert_sort(data):
for i in range(1, len(data)):
tmp = data[i]
j = i - 1
while j>=0 and data[j] > tmp:
data[j],data[j + 1] = data[j + 1],data[j]
j -= 1
data[j + 1] = tmp
三、选择排序
原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
def select_sort(data):
for i in range(len(data)-1):
min_num = i
for j in range(i+1, len(data)):
if data[j]<data[i]:
min_num = j
data[i], data[min_num] = data[min_num], data[i]
四、快速排序
原理:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
def quick_sort(data,left,right):
if left<right:
mid = partition(data,left,right):
quick_sort(data,left,mid-1)
quick_sort(data,mid+1,right)
def partition(data,left,right):
tmp = data[left]
while left < right:
while left < right and data[right]>=tmp:
right -= 1
data[left] = data[right]
while left < right and data[left]<=tmp:
left += 1
data[right] = data [left]
data[left] = tmp
return left
五、堆排序
原理:堆积排序(Heapsort)是指利用堆积树(堆)这种资料结构所设计的一种排序算法,可以利用数组的特点快速定位指定索引的元素。
def sift(data,low,high):
i = low
j = 2*i + 1
tmp = data[i]
while j <= high: # 只要没到最后根最后
if j < high and data[j] < data[j + 1]: # 是否有右孩子,且右孩子大于左孩子
j = j + 1 # j 成为最大孩子的下标
if tmp < data[j]: # 最大的孩子是否大于父亲
data[i] = data[j] # 子孩子上位
i = j # 重新赋值下标
j = 2*i + 1
else: # 上述条件都不满足,跳出循环
break
data[i] = tmp
def heap_sort(data):
n = len(data)
for i in range(n // 2 -1 ,-1,-1):
sift(data,i,n-1)
for i in range(n-1,-1,-1):
data[0],data[i] = data[i],data[0]
sift(data,0,i-1)