1.参考

一本关于排序算法的 GitBook 在线书籍 《十大经典排序算法》,使用 JavaScript & Python & Go 实现

2.冒泡排序:两两比较,互换位置

arr = [9,8,2,23,3]

# 冒泡排序 两两比较,互换位置
# 3 5 9 1 8
# A B C D E
# 3 5 9 1 8
# 3 5 9 1 8
# 3 5 1 9 8
# 3 5 1 8 9
# 第一轮比较将最大数排到最后,5个数总共需要4轮即1,2,3,4
# 比较是arr[j] > arr[j+1],第一轮j取前4个数即range(4)即可,第二轮j取前3个数range(3)即可
# 5个数总共比较 4 3 2 1 = 10次 def bubble_sort(arr):
print 'bubble_sort:',arr
count = 0
for i in range(1, len(arr)):
for j in range(len(arr)-i):
count += 1
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
print 'bubble_sorted:', count, arr
bubble_sort([9,8,2,23,3])
# bubble_sort([int(i) for i in raw_input(':').split()])

2.选择排序:找出极值,换到队头

# 3 5 9 1 8
# A B C D E def select_sort(arr):
count = 0
for i in range(len(arr)-1): #总共需要4次min or max
arr_min = min(arr[i:]) #取出的数放在列首更容易处理
arr.remove(arr_min)
arr.insert(i, arr_min) #注意插入位置更新
print arr
# select_sort(arr[:]) # 五个数字需要4轮
# 0位和1,2,3,4比较,小的马上换到0位
# 1位和2,3,4比较,小的马上换到1位 def select_sort1(arr):
count = 0
for i in range(len(arr)-1):
for j in range(i+1, len(arr)):
count += 1
if arr[i] > arr[j]: #注意arr[i]一直被更新
arr[i], arr[j] = arr[j], arr[i]
print count
print arr
# select_sort1(arr[:]) def select_sort2(arr):
print 'select_sort2:',arr
count = 0
for i in range(len(arr)-1):
min_index = i
for j in range(i+1, len(arr)):
count += 1
if arr[min_index] > arr[j]:
min_index = j
arr[i], arr[min_index] = arr[min_index], arr[i] #一轮之后再更新 arr[i]
print 'select_sort2ed:', count, arr
select_sort2([9,8,2,23,3])

3.插入排序:打牌,已排+未排,逐个插入(折半优化)

# 3 5 9 1 8
# A B C D E
#A已排序,BCDE未排序
#AB已排序,CDE未排序
def insert_sort(arr):
print 'insert_sort:',arr
count = 0
for i in range(1, len(arr)): #操作数是B
for j in range(0,i): #操作数是A
count += 1
print 'B', arr[i], 'A', arr[j], arr
if arr[i] < arr[j]:
arr.insert(j, arr[i])
arr.pop(i+1) #先插入,导致原来要移除的位置推后1位
print arr
break
print 'insert_sorted:', count, arr insert_sort([9,8,2,23,3])

最新文章

  1. [LeetCode] Number of Islands 岛屿的数量
  2. UIButton设置圆角和边框及边框颜色
  3. C++学习笔记24:makefile文件
  4. Set和Map
  5. 安卓开发错误:The type android.support.v4.app.TaskStackBuilder$SupportParentable cannot be resolved.
  6. dump iot表
  7. 理解Java NIO
  8. WebService- 使用 CXF 开发 SOAP 服务
  9. 使用PageHeap.EXE或GFlags.EXE检查内存越界错误
  10. IOS使用FMDB封装的数据库增删改查操作
  11. k8s之Hello World(四)
  12. 从零开始学C#——数据类型(三)
  13. PAT 乙级 1061. 判断题(15)
  14. 20155206 2016-2017-2 《Java程序设计》第7周学习总结
  15. express session
  16. linux服务器的Gzip文件压缩方法[转]
  17. mysql驱动(github上的)
  18. .Net Core中使用UEditor
  19. 贪心算法和动态规划[zz]
  20. 高性能Web服务器Nginx的配置与部署研究(6)核心模块之主模块的测试常用指令

热门文章

  1. CString/string 区别及其转化
  2. hibernate框架学习之持久化对象OID
  3. less/sass 基础base文件
  4. vue-cli(vue脚手架)超详细教程
  5. MySQL NULL处理
  6. Ex3_2 最近点对
  7. swift 学习- 16 -- 构造过程 02
  8. js调用ajax案例2,使用ok
  9. Confluence 6 使用 Apache 的 mod_jk
  10. Confluence 6 数据库表-授权(Authentication)