Python常用排序算法

 #快排  1 def q_sort(l):
 2     left = 0
 3     right = len(l)-1
 4     return q(l,left,right)
 5
 6 def quick_sort(l,left,right):
 7     if left >= right:
 8         return l
 9     low = left
10     high = right
11     while right>left:
12         while right>left and l[right] >= l[left]:
13             right -=1
14         l[right],l[left] = l[left],l[right]
15         while right>left and l[right] >= l[left]:
16             left += 1
17         l[right],l[left] = l[left],l[right]
18     q(l,low,left-1)
19     q(l,left+1,high)
20     return l
 #堆排序 1 def heap_sort(l):
 2     n = len(l)                #  n-1 最后一个节点标号
 3     first = (n/2-1)    #最后一个非叶子节点
 4     for start in range(first,-1,-1):
 5         max_heap(l,start,n-1)
 6
 7     for end in range(n-1,0,-1):
 8         l[end],l[0] = l[0],l[end]
 9         max_heap(l,0,end-1)         #去除最后一个节点 标号往前重构
10     return l
11
12
13 def max_heap(l,start,end):
14     root = start
15     while True:
16         child = root*2 + 1
17         if child > end:break
18         if child+1 <= end and l[child] < l[child+1]:
19             child += 1
20         if l[root] < l[child] :
21             l[root],l[child] = l[child],l[root]
22             root = child
23         else:
24             break
 #堆排序取前100大 1 def heap_sort(l):
 2     n = len(l)
 3     first = n/2-1        # 最后一个非叶子节点
 4     for start in range(first,-1,-1):
 5         min_heap(l,start,n-1)
 6
 7     for end in range(n-1,0,-1):
 8         l[end] ,l[0] = l[0] , l[end]
 9         min_heap(l,0,end-1)
10     return l
11
12
13 def min_heap(l,start,end):
14     root = start
15     while 1:
16         child = root*2+1
17         if child > end :break
18         if child+1 <= end and l[child] > l[child+1]:
19             child+=1
20         if l[root] > l[child]:
21             l[root],l[child] = l[child],l[root]
22             root = child
23         else:
24             break
25
26 def qu(x):          #x为传入数列,z为输出前100的列表
27     z = heap_sort(x[:100])
28     print ‘z:‘,z
29     for i in x[100:]:
30         if i > z[99]:
31             z[99]=i
32             heap_sort(z)
33     return z
 #归并排序 1 def merge_sort(l):
 2     if len(l) <= 1:
 3         return l
 4     num = len(l)/2
 5     left = merge_sort(l[:num])
 6     right = merge_sort(l[num:])
 7     return merge(left,right)
 8
 9 def merge(left,right):
10     i=j=0
11     r=[]
12     while i<len(left) and j<len(right):
13         if left[i] <= right[j]:
14             r.append(left[i])
15             i+=1
16         else:
17             r.append(right[j])
18             j+=1
19     r += left[i:]
20     r += right[j:]
21     return r
1 #冒泡
2 def maopao(seq):
3     for i in range(0,len(seq)-1):
4         for j in range(0,len(seq)-1-i):
5             if seq[j] > seq[j+1]:
6                 seq[j],seq[j+1]=seq[j+1],seq[j]
7     return seq    
 1 #插入
 2 def DirectInsert(seq):
 3     for i in range(1,len(seq)):
 4         temp, j = seq[i], i
 5         while j>0 and temp < seq[j-1]:
 6             seq[j] = seq[j-1]
 7             j = j-1
 8         seq[j] = temp
 9     return seq
10
11 #插入(从中间开始)
12 def DI(seq):
13     for i in range(1,len(seq)):
14         temp, j,k = seq[i], i, i/2
15         if temp < seq[k]:
16             while k>0 and temp < seq[k-1]:
17                 seq[k] = seq[k-1]
18                 k = k-1
19             seq[k] = temp
20         else:
21             while j>0 and temp < seq[j-1]:
22                 seq[j] = seq[j-1]
23                 j = j-1
24             seq[j] = temp
25     return seq
1 #直接选择排序
2 def select_sort(l):
3     for i in range(0,len(l)):
4         min = i
5         for j in range(i+1,len(l)):
6             if l[min] > l[j]:
7                 min = j
8         l[min],l[i] = l[i],l[min]
9     return l

参考:http://www.cnblogs.com/jztan/p/5878630.html

时间: 2024-12-15 06:56:17

Python常用排序算法的相关文章

几种常用排序算法的python实现

1:快速排序 思想: 任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序. 一趟快速排序的算法是: 1)设置两个变量i.j,排序开始的时候:i=0,j=N-1: 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]: 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]赋给A[i]: 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大

常用排序算法的python实现

排序算是编程最基本的算法问题之一了,熟练掌握排序算法也能加深自己对数据结构的理解,也能提高自己的编程能力,以下为个人参考许多大神博客后对常用排序算法的学习总结. 目录: 概述 冒泡排序 直接插入排序 简单选择排序 希尔排序 堆排序 归并排序 快速排序 算法的比较与测试 参考 1. 概述 所谓排序(sorting)就是整理数据的序列,使其按照特定顺序排列的操作.排序在现实生活中(如整理书籍,表格数据等),在计算领域中(如二分查找,图论的最小生成树的Kruskal算法)均有重要意义,所以一种高效的排

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排

Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排序(直接选择排序.堆排序) 4)归并排序 5)分配排序(基数排序) 所需辅助空间最多:归并排序 所需辅助空间最少:堆排序 平均速度最快:快速排序 不稳定:快速排序,希尔排序,堆排序. 先来看看 8种排序之间的关系: 1.直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2]

七种常用排序算法

七种常用排序算法 一.常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间. 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度. 稳定性:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同就稳定,反之不稳定. 视觉直观感受 7 种常用的排序算法 二.算法C#实现: 1. 直接插入排序: using System; using System.Collections.Generic; using System.Linq; using Sys

常用排序算法之——归并排序

归并排序的原理: 如果数组的元素个数大于1,则: 将数组平均分为两部分: 左边的数组归并排序:递归 右边的数组归并排序:递归 将两个各自有序的数组合并,需要一个额外的辅助数组,暂时保存合并结果:返回 否则,数组元素个数为1时,已经有序:直接返回. 稳定排序.时间复杂度在最坏.最好.平均情况下都为O(N lgN),空间复杂度为O(N). 代码: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T>

常用排序算法之——快速排序

快速排序的原理: 首先找一个标兵值,等于某一个元素值:遍历数组,将数组分为小于标兵值和大于标兵值的两部分:然后分别对两个部分采用快速排序,递归. 分开数组时,维持一个指针,指向已找到小部分的最后一个元素:一个指针用于遍历. 不稳定排序算法.当数组已经有序时,时间复杂度最差,为O(N2),平均.最优情况下都为O(N lgN). 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 v

javascript常用排序算法实现

毕业后,由于工作中很少需要自已去写一些排序,所以那些排序算法都忘得差不多了,不过排序是最基础的算法,还是不能落下啦,于是找了一些资料,然后用Javascript实现了一些常用的算法,具体代码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>

常用排序算法实现[交换排序之冒泡排序、快速排序]

相关知识 1. 稳定排序和非稳定排序: 稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序. 如果排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 2. 内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序: 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序. 3.算法分类 排序算法从理论上分为如下几类: (1) 交换排序法: