网上有很多关于算法的Java和C的实现方式,这里对很多人都不太友好,今天来把几种排序方法用Python实现,算法讲解博客参考:
参考文献
冒泡排序
选择排序
插入排序
快速排序
排序算法的关键在于交换的轮数和交换次数!!
冒泡排序
关键点在于"冒泡"
def bubble(li):
n = len(li)
for j in range(n):
for i in range(n-1-j):
if li[i] > li[i+1]:
li[i],li[i+1] = li[i+1],li[i]
print(li)
if __name__ == "__main__":
li = [54,26,93,17,77,31,44,55,20]
bubble(li)
选择排序
关键点在于"每次只取出一个"最小值"排到最左边"
这个选择在于分为 有序和无序序列时候,从后面无序序列选择一个最小的值与有序的交换或者放在其最后面。
def select(li):
n = len(li)
for i in range(n):
min_index = i ##每一轮假设第一个数是最小值
for j in range(i,n):
if li[min_index] > li[j]: #后面有数比假设最小的值大时
min_index = j
li[min_index],li[i] = li[i],li[min_index]
print(li)
if __name__ == "__main__":
li = [54,26,93,17,77,31,44,55,20]
select(li)
插入排序
关键点在于"插入",突破口为有序和无序
这个插入在于分为 有序和无序序列时候,从后面无序序列顺序取出一个元素和前面的每个元素相比较,插入到有序序列中。
def insert(li):
n = len(li)
for i in range(n):
j = i
while j>0:
if li[j]<li[j-1]:
li[j],li[j-1] = li[j-1],li[j]
j-=1
if __name__ == "__main__":
li = [54,26,93,17,77,31,44,55,20]
insert(li)
print(li)
快速排序
关键点在于确定好基准元素,基准元素的两边分别为比基准元素小的,和比基准元素大的
def quick(first,last,li):
mid_value = li[first]
left = first
right = last
if first >=last:
return None
while left < right:
while left <right and li[right] >= mid_value:##先从右边开始
right -= 1
li[left] = li[right]
while left <right and li[left] < mid_value:
left += 1
li[right] = li[left]
li[right] = mid_value
quick(first,left-1,li)
quick(left+1,last,li)
if __name__ == "__main__":
li = [54,26,93,17,77,31,44,55,20]
first = 0
last = len(li)-1
quick(first,last,li)
print(li)