其实本文叫排序算法总结有点过了,只是用python实现了一遍。本文都是参照一篇csdn博客《数据结构排序算法》,里面详细介绍每种排序算法的原理,并给出了C++的实现,再次膜拜。

# -*- coding: gb2312 -*-

# 交换两个数

def swap(a, b):

return b, a

# 冒泡排序

# 进行两次嵌套排序

# 每一次排序将最大或最小移到最右端

# 下次排序排序 Length+1-i

class Sort(object):

def __init__(self, list):

self.list = list

def bubbleSort(self, btype=True):

l = self.list[:]

if not self.list:

return l;

length = len(l)

for i in range(0, length-1):

print_flag = False

for j in range(0, length-i-1):

if btype: # 升序

if l[j] > l[j+1]:

print_flag = True

l[j], l[j+1] = swap(l[j], l[j+1])

else: # 降序

if l[j] < l[j+1]:

print_flag = True

l[j], l[j+1] = swap(l[j], l[j+1])

if print_flag: print '一趟冒泡排序后: ',l

print l

def bubbleSort2(self, btype=True):

l = self.list[:]

if not self.list:

return l;

length = len(l)

for i in range(length-1,0, -1):

for j in range(0, i):

if btype: # 升序

if l[j] > l[j+1]:

l[j], l[j+1] = swap(l[j], l[j+1])

else: # 降序

if l[j] < l[j+1]:

l[j], l[j+1] = swap(l[j], l[j+1])

print l

# 直接插入排序

# 在一个已经有序的数据序列插入一个数,使插入数据后序列仍然有序

# 首先,将第0个元素视为一个已经排好序的序列

# 从1到length-1依次进行直接插入操作

# 每次插入,以之前排好序的序列为基础,如序列为[0:i-1]

# 找合适的位置插入第i个元素

# 循环以上步骤直到循环结束

def insertSort(self, btype=True):

l = self.list[:]

if not self.list:

return l

length = len(l)

for i in range(1, length):

print_flag = False

for j in range(i, 0, -1):

if btype:

if l[j] < l[j-1]:

print_flag = True

l[j-1], l[j] = swap(l[j-1], l[j])

else:

break

else:

if l[j] > l[j-1]:

print_flag = True

l[j-1], l[j] = swap(l[j-1], l[j])

else:

break

if print_flag: print '一趟插入排序后: ', l

print l

# 希尔排序

# 希尔排序(Shell Sort)是插入排序的一种。

# 是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。

# 先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。

# 先在各组内进行直接插入排序;然后,取第二个增量d2

# 直至所取的增量dt=1(dt

def shellSort(self, btype=True):

l = self.list[:]

if not self.list:

return l

n = len(l)

gap = n/2

while gap > 0:

print_flag = False

for i in range(gap, n):

j = i

while j>=gap:

if btype:

if l[j] < l[j-gap]:

print_flag = True

l[j], l[j-gap] = swap(l[j], l[j-gap])

else:

break

else:

if l[j] > l[j-gap]:

print_flag = True

l[j], l[j-gap] = swap(l[j], l[j-gap])

else:

break

j -= gap

print '一趟希尔排序后(gap=%d): ' %gap, l

gap /= 2

print l

结果:

python实现希尔排序算法_排序算法总结(冒泡排序、直接插入排序、希尔排序)(python实现)...相关推荐

  1. php二分法 冒泡 快速排序,PHP 常见算法【冒泡排序, 快速排序, 插入排序, 取舍排序, 二分法查找, .】...

    PHP 常见算法[冒泡排序, 快速排序, 插入排序, 选择排序, 二分法查找, ..] // 冒泡排序 function bubblesort($arr) { for($i=0,$j=count($a ...

  2. cb32a_c++_STL_算法_查找算法_(5)adjacent_find

    cb32a_c++_STL_算法_查找算法_(5)adjacent_find adjacent_find(b,e),b,begin(),e,end() adjacent_find(b,e,p),p-p ...

  3. 常用十大算法_回溯算法

    回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...

  4. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

  5. java shell排序算法_【算法】8种排序算法(Java)

    排序算法 上一篇博客中写到了关于动态规划中一些常见的问题和解决方案,根据问题总结出来解决动态规划类问题的方法是通过寻找状态,列出状态转移方程,通过遍历即可将问题解决.排序也是一类常见的问题,通过排序的 ...

  6. 9个元素换6次达到排序序列_(算法四)高级排序(快速排序)

    1.快速排序 快速排序是对冒泡排序的一种改进.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速 ...

  7. 合并排序算法排序过程_基本算法:合并排序

    合并排序算法排序过程 每个程序员都需要了解他们的算法和数据结构. 在研究它们时,您需要确保确切了解它的功能,时间和空间的复杂性以及采用这种方式的原因,并且不仅能够对其进行编码,而且能够手动执行. 这就 ...

  8. 木桶排序算法_这才是你想要桶排序

    前面说的 昨天发的桶排序文章,有同学回复,确实有比较精明的同学,文章就是想提出一个比较简单的思路,本来想给自己的排序方式写个名字叫做"木桶排序",这篇文章讲解真正的桶排序,结合前面 ...

  9. python序列模式的关联算法_关联算法

    以下内容来自刘建平Pinard-博客园的学习笔记,总结如下: 1 Apriori算法原理总结 Apriori算法是常用的用于挖掘出数据关联规则的算法,它用来找出数据值中频繁出现的数据集合,找出这些集合 ...

  10. python实现快速排序算法_基础算法:快速排序(python实现)

    算法原理 快速排序是一个具有较高性能的排序算法,其主要思想如下: 对数组中的某个元素,确定其在数组中的排序位置,即在其之前的所有元素均小于该元素,在其之后的均大于该元素.对小元素组和大元素组同样执行该 ...

最新文章

  1. 你可能已经知道或者不知道的ASP.NET 2.0技巧(转载)
  2. C# 文本输入限制类型,datagridview单元格输入验证
  3. python是一门什么课程-为什么一定要让孩子学会一门编程语言?
  4. UA OPTI501 电磁波 经典电动力学中的Fourier方法基础
  5. [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式
  6. Github标星3.7k:微软出的数据科学入门课程(附下载)
  7. ITK:向索引添加偏移量
  8. MySQL的基本语法
  9. Mac下Virtual Box Host-Only网络配置
  10. hdu 1576 A/B
  11. 48 MM配置-库存管理和实际库存-工厂参数
  12. OpenCV 4.0 rc版本发布,扩展计算图Graph API
  13. 用40年前的电脑打开女神图片,这你敢信?
  14. ×××全功能邮件系统(3)
  15. 基金指数温度怎么算_温度换算(指数基金温度计算器)
  16. Shell脚本调用阿里云API实现DDNS动态域名解析
  17. 使用STM32CubeMX和SW4STM32在Nucleo-F401RE开发板轻松实现Blinky闪烁 [
  18. 定点补码加减法运算_定点加减法运算与溢出判断处理
  19. day 55 定位流(相对,绝对,固定)
  20. Firefox火狐浏览器如何本地备份导入、导出密码

热门文章

  1. 同一个世界不同的人(转)
  2. [转载]保护 ASP.NET 应用程序的安全
  3. javascript基础系列:字符串的常用方法
  4. 关于table的那些用法(一)
  5. WEB开发中合理选择图片格式
  6. matlab2008设置子函数断点无效,程序不在断点处停止
  7. 7-138 打印沙漏 (20 分)
  8. hadoop 批流处理的实现_从T+1到T+0,浅谈PetaBase的实时流式处理
  9. laravel 先排序后分组怎么写_希尔排序算法拆解解析
  10. Vue小案例 之 商品管理------创建页面与部分数据