码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法

时间:2015-05-03 18:46:12      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

1.冒泡排序:比较相邻的的两个元素,并将大(小的)往后(前)移动。

技术分享

实现代码:

def asc(ary):
    n=len(ary)
    for i in range(n):
        for j in range(0,n-i-1):
            if not less(ary[j],ary[j+1]):
                ary[j],ary[j+1]=ary[j+1],ary[j]
    return ary
def desc(ary):
    n=len(ary)
    for i in range(0,n):
        for j in range(n-2,i-1,-1):
            if less(ary[j],ary[j+1]):
                ary[j],ary[j+1]=ary[j+1],ary[j]
    return ary
def less(value1,value2):
    return value1<value2
分类 排序算法
数据结构 数组
最差时间复杂度 技术分享
最优时间复杂度 技术分享
平均时间复杂度 技术分享
最差空间复杂度 总共技术分享,需要辅助空间技术分享

2.堆排序

堆排序在 top K 问题中使用比较频繁。堆排序是采用二叉堆的数据结构来实现的。该结构虽然实质上还是一维数组但近似完全二叉树 并同时满足堆积性质:父节点的值大于(小于)子节点的值。

访问相关节点:

对于大小为n的一维数组,数组中的下标为1~n-1

  • 父节点i的左子节点在位置(2*i+1);
  • 父节点i的右子节点在位置(2*i+2);
  • 子节点i的父节点在位置floor((i-1)/2);

堆中定义以下几种操作:

  • 最大堆调整(Max_Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点
  • 创建最大堆(Build_Max_Heap):将堆所有数据重新排序
  • 堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整运算

实现代码:

 1 def heap_sortasc(ary):
 2     n=len(ary)
 3     first=int(n/2)-1#z最后一个非叶子节点
 4     for start in range(first,-1,-1):#构造大根堆
 5         max_heapify(ary,start,n)
 6     for end in range(n-1,-1,-1):#堆排,将大根堆转换成有序数组
 7         ary[end],ary[0]=ary[0],ary[end]
 8         max_heapify(ary,0,end)
 9     return ary
10 #最大堆调整,将堆的末端子节点作调整,使得子节点永远小于父节点
11 #start为当前需要调整
12 #递归实现
13 def  max_heapify(ary,root,size):
14     while True:
15         child=root*2+1#调整节点的子节点
16         if root<int(size/2):
17             if child+1<size and less(ary[child],ary[child+1]):
18                 child=child+1#取较大的子节点
19             if less(ary[root],ary[child]):#较大的子节点成为父节点
20                 ary[root],ary[child]=ary[child],ary[root]#变换
21                 root=child
22             else:
23                 break
24         else:
25             break
26 def heap_sortdesc(ary):
27     n=len(ary)
28     first=int(n/2)-1#z最后一个非叶子节点
29     for start in range(first,-1,-1):#构造小根堆
30         min_heapify(ary,start,n)
31     for end in range(n-1,-1,-1):#堆排,将小根堆转换成有序数组
32         ary[end],ary[0]=ary[0],ary[end]
33         min_heapify(ary,0,end)
34     return ary
35 #最小堆调整,将堆的末端子节点作调整,使得子节点永远大于父节点
36 #start为当前需要调整
37 #递归实现
38 def  min_heapify(ary,root,size):
39     while True:
40         child=root*2+1#调整节点的子节点
41         if root<int(size/2):
42             if child+1<size and less(ary[child],ary[child+1])==False:
43                 child=child+1#取较小的子节点
44             if less(ary[root],ary[child])==False:#较小的子节点成为父节点
45                 ary[root],ary[child]=ary[child],ary[root]#变换
46                 root=child
47             else:
48                 break
49         else:
50             break
51 def less(value1,value2):
52     return value1<value2

 

算法复杂度:

分类  
数据结构 数组
最差时间复杂度 技术分享
最优时间复杂度 技术分享
平均时间复杂度 技术分享
最差空间复杂度 技术分享 total, 技术分享auxiliary

排序算法

标签:

原文地址:http://www.cnblogs.com/bzsh/p/4474301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!