算法基础:冒泡-选择-插入排序
冒泡排序
冒泡排序图解

冒泡排序代码
def bubble_sort(li):
for i in range(len(li) - 1):
for j in range(len(li) - i - 1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j] #大数在前面我就直接交换,只有python有这语法
冒泡排序-优化

冒泡排序-优化代码
def bubble_sort_1(li):
for i in range(len(li) - 1):
exchange = False
for j in range(len(li) - i - 1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
exchange = True
if not exchange:
break
i是多少趟
data =list(range(5)) random.shuffle(data) #把一个函数打乱 print(data) bubble_sort(data) print(data)
打印结果:
[2, 0, 1, 4, 3] 0 1 2 3
j是交换的次数
import random
def bubble_sort(li):
for i in range(len(li) - 1): #i是多少趟
for j in range(len(li) - i - 1): #j交换的次数
print(j)
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j] #大的在前面我就直接交换
data =list(range(5))
测试结果如下:
第一次交换 0 1 2 3 第二次交换 0 1 2 第三次交换 0 1 第四次交换 0
大数在前面我就直接交换,只有python有这语法
li[j], li[j+1] = li[j+1], li[j]
如果想降序排列如何执行
1、代码
import random
def bubble_sort(li):
for i in range(len(li)-1): #第i趟
for j in range(len(li)-i-1):
if li[j] < li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
print(li)
li = [9,8,7,1,2,3,4,5,6]
print(li)
bubble_sort(li)
2、输出结果
[9, 8, 7, 1, 2, 3, 4, 5, 6] [9, 8, 7, 2, 3, 4, 5, 6, 1] [9, 8, 7, 3, 4, 5, 6, 2, 1] [9, 8, 7, 4, 5, 6, 3, 2, 1] [9, 8, 7, 5, 6, 4, 3, 2, 1] [9, 8, 7, 6, 5, 4, 3, 2, 1] [9, 8, 7, 6, 5, 4, 3, 2, 1] [9, 8, 7, 6, 5, 4, 3, 2, 1] [9, 8, 7, 6, 5, 4, 3, 2, 1]
打印排序过程
1、优化前
实现代码
import random
def bubble_sort(li):
for i in range(len(li)-1): #第i趟
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
print(li)
li = [9,8,7,1,2,3,4,5,6]
print(li)
bubble_sort(li)
测试结果
[9, 8, 7, 1, 2, 3, 4, 5, 6] [8, 7, 1, 2, 3, 4, 5, 6, 9] [7, 1, 2, 3, 4, 5, 6, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9]
2、优化后
1、实现代码
import random
def bubble_sort(li):
for i in range(len(li)-1): #第i趟
exchange = False
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
exchange = True
print(li)
if not exchange:
return
li = [9,8,7,1,2,3,4,5,6]
print(li)
bubble_sort(li)
2、测试结果
[9, 8, 7, 1, 2, 3, 4, 5, 6] [8, 7, 1, 2, 3, 4, 5, 6, 9] [7, 1, 2, 3, 4, 5, 6, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9]
优化前和优化后性能比较
import random
import time
import copy
import sys
def cal_time(func):
def wrapper(*args, **kwargs):
t1 = time.time()
result = func(*args, **kwargs)
t2 = time.time()
print("%s running time: %s secs." % (func.__name__, t2 - t1))
return result
return wrapper
@cal_time
def bubble_sort(li):
for i in range(len(li) - 1): #i是多少趟
for j in range(len(li) - i - 1): #j交换的次数
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j] #大的在前面我就直接交换
@cal_time
def bubble_sort_1(li):
for i in range(len(li) - 1):
exchange = False
for j in range(len(li) - i - 1):
if li[j] > li[j+1]:
li[j], li[j+1] = li[j+1], li[j]
exchange = True
if not exchange:
break
data = list((range(10000)))
random.shuffle(data)
bubble_sort(data)
bubble_sort_1(data)
print(data)
测试结果:
"C:\Program Files\Python35\python.exe" C:/python14/day06/3.py bubble_sort running time: 10.17458200454712 secs. bubble_sort_1 running time: 0.0009999275207519531 secs. Process finished with exit code 0
选择排序
选择排序思路核心思想

选择排序代码
def select_sort(li):
for i in range(len(li) - 1):
min_loc = i
for j in range(i+1,len(li)):
if li[j] < li[min_loc]:
min_loc = j
li[i], li[min_loc] = li[min_loc], li[i]
时间复杂度:O(n2)
import random
def select_sort(li):
for i in range(len(li) - 1):
print(i)
min_loc = i
for j in range(i+1,len(li)):
print(j)
if li[j] < li[min_loc]:
min_loc = j
li[i], li[min_loc] = li[min_loc], li[i]
data =list(range(5))
random.shuffle(data) #把一个函数打乱
print(data)
select_sort(data)
print(data)
[3, 0, 2, 1, 4]
[3, 0, 2, 1, 4] 0 1 2 3 4 1 2 3 4 2 3 4 3 4 [0, 1, 2, 3, 4]
[4, 0, 3, 2, 1]
[4, 0, 3, 2, 1] 0 1 2 3 4 1 2 3 4 2 3 4 3 4 [0, 1, 2, 3, 4]
打印排序过程
1、实现代码
def select_sort(li):
for i in range(len(li)-1): # i是第几趟
min_loc = i
for j in range(i+1, len(li)):
if li[j] < li[min_loc]:
min_loc = j
li[i], li[min_loc] = li[min_loc], li[i]
print(li)
li = [3,4,2,1,5,6,8,7,9]
print(li)
select_sort(li)
#print(li)
2、测试结果
[3, 4, 2, 1, 5, 6, 8, 7, 9] [1, 4, 2, 3, 5, 6, 8, 7, 9] [1, 2, 4, 3, 5, 6, 8, 7, 9] [1, 2, 3, 4, 5, 6, 8, 7, 9] [1, 2, 3, 4, 5, 6, 8, 7, 9] [1, 2, 3, 4, 5, 6, 8, 7, 9] [1, 2, 3, 4, 5, 6, 8, 7, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9]
插入排序
插入排序思路


插入排序代码
def insert_sort(li):
for i in range(1, len(li)):
tmp = li[i]
j = i - 1
while j >= 0 and li[j] > tmp:
li[j+1]=li[j]
j = j - 1
li[j + 1] = tmp
实际测试代码如下:
import random
def insert_sort(li):
for i in range(1, len(li)):
tmp = li[i]
j = i - 1
while j >= 0 and li[j] > tmp:
print(j)
li[j+1]=li[j]
j = j - 1
li[j + 1] = tmp
data = list(range(5))
random.shuffle(data) #把一个函数打乱
print(data)
insert_sort(data)
测试结果如下:
"C:\Program Files\Python35\python.exe" C:/python14/day06/5.py [3, 0, 2, 4, 1] 0 1 3 2 1 [2, 1, 4, 3, 0] 0 2 3 2 1 0 [1, 3, 4, 2, 0] 2 1 3 2 1 0 [1, 0, 4, 3, 2] 0 2 3 2
打印排序过程
1、实现代码
def insert_sort(li):
for i in range(1, len(li)): #i 表示摸到的牌的下标
tmp = li[i]
j = i - 1 #j指的是手里的牌的下标
while j >= 0 and li[j] > tmp:
li[j+1] = li[j]
j -= 1
li[j+1] = tmp
print(li)
li = [3,2,4,1,5,7,9,6,8]
print(li)
insert_sort(li)
#print(li)
2、测试结果
[3, 2, 4, 1, 5, 7, 9, 6, 8] [2, 3, 4, 1, 5, 7, 9, 6, 8] [2, 3, 4, 1, 5, 7, 9, 6, 8] [1, 2, 3, 4, 5, 7, 9, 6, 8] [1, 2, 3, 4, 5, 7, 9, 6, 8] [1, 2, 3, 4, 5, 7, 9, 6, 8] [1, 2, 3, 4, 5, 7, 9, 6, 8] [1, 2, 3, 4, 5, 6, 7, 9, 8] [1, 2, 3, 4, 5, 6, 7, 8, 9]
作者:罗阿红
出处:http://www.cnblogs.com/luoahong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

浙公网安备 33010602011771号