python排序算法的简单实现方法

1 冒泡排序

1.1 算法步骤:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

(1) 不管原始数组是否有序,时间复杂度都是O(n2)

(2) 空间复杂度是O(1)

(3) 冒泡排序是从最后一位开始确定最大或最小的数,保证后面的数都是有序的且都大于或小于前面的数

1.2 算法实现

def bubble_sort(alist):
    for i in range(len(alist) - 1):
        for j in range(len(alist) - 1 - i):##最后的几位已经确定好大小的不用再次参与排序
            if alist[j] > alist[j + 1]:
                alist[j], alist[j + 1] = alist[j + 1], alist[j]
                count += 1
list = [3, 4, 2, 7, 11, 15, 5]
bubble_sort(list)
print(list)

1.3 算法优化

def bubble_sort(alist):
    for i in range(len(alist) - 1):
        count = 0  ## 记录交换的次数
        for j in range(len(alist) - 1 - i):
            if alist[j] > alist[j + 1]:
                alist[j], alist[j + 1] = alist[j + 1], alist[j]
                count += 1 ## 如果此次遍历为未发生交换,则说明数据是有序的
        if count == 0:
            return
list = [3, 4, 2, 7, 11, 15, 5]
bubble_sort(list)
print(list)

2 选择排序

2.1 算法步骤

  1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  2. 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  3. 以此类推,直到所有元素均排序完毕

2.2 算法实现

def select_sort(alist):
    for i in range(len(alist) - 1):
        min = i  ## i之前的元素已经确定位置,假设第i个元素为最小值
        for j in range(i, len(alist)):
            if alist[min] > alist[j]: ## 如果后面的元素比第i个元素小,则记录该元素的索引为最小元素的索引
                min = j
            alist[i], alist[min] = alist[min], alist[i]
list = [3, 4, 2, 7, 11, 15, 5]
select_sort(list)
print(list)

3 插入排序

3.1 算法步骤

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。

3.2 算法实现

def insert_sort(alist):
    for i in range(1, len(alist)):
        for j in range(i, 0, -1):  ## 倒序取从下标i的元素开始到下标0
            if alist[j] < alist[j - 1]:
                alist[j], alist[j - 1] = alist[j - 1], alist[j]

list = [3, 4, 2, 7, 11, 15, 5]
insert_sort(list)
print(list)

3.3 算法优化

def insert_sort(alist):
    for i in range(1, len(alist)):
        for j in range(i, 0, -1):  ## 倒序取从下标i的元素开始到下标0
            if alist[j] < alist[j - 1]:
                alist[j], alist[j - 1] = alist[j - 1], alist[j]
            else: ## 如果当前数值大于前一个数值,退出
                break

list = [3, 4, 2, 7, 11, 15, 5]
insert_sort(list)
print(list)

4 快速排序

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

4.1 算法描述

快速排序使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

  1. 从数列中挑出一个元素,称为 “基准”(pivot);
  2. 将大于pivot的值放在pivot的右边;
  3. 将小于pivot的值放在pivot的左边;
  4. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

4.2 算法实现

def quickSort(left, right, lst):
    l, r = left, right ## 确定左右指针
    if left >= right: ## 如果序列只有一个元素,则退出排序
        return
    ## 确定基准数为最左侧元素
    base = lst[left]
    ## base为序列最左侧元素,则应为右指针先左移,然后左指针右移
    while l < r:
        while l < r and lst[r] >= base: ## 如果l<r同时最右侧的值大于等于base,则向左移动r指针,退出的条件右指针的值<base
            r -= 1
        while l < r and lst[l] <= base: ## 如果l<r同时最左侧的值小于等于base,则向右移动l指针,退出的条件左指针的值>base
            l += 1
        if l < r:  ##  如果左指针小于右指针(同时lst[r] < base lst[l] > base,满足上述两个条件),则交换左右指针的值
            lst[l], lst[r] = lst[r], lst[l]
    lst[l], lst[left] = lst[left], lst[l] ## 基准数回归,将左右指针所指元素和基准数进行交换
    ## 此时一次排序结束

    quickSort(left, l - 1, lst) ## 对基准数左侧序列进行排序
    quickSort(l + 1, right, lst)  ## 对基准数右侧序列进行排序
list = [3, 4, 2, 7, 11, 15, 5]
end = len(list) - 1
quickSort(0, end, list)  ## 开始位置索引,结束位置索引,列表
print(list)

4 四种排序算法的比较

算法 时间复杂度(平均) 空间复杂度 稳定性
冒泡排序 O(n2) O(1) 稳定
选择排序 O(n2) O(1) 不稳定
插入排序 O(n2) O(1) 稳定
快速排序 O(nlog2n) O(nlog2n) 不稳定

总结

到此这篇关于python排序算法简单实现的文章就介绍到这了,更多相关python排序算法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于python的七种经典排序算法(推荐)

    一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定的. 内排序和外排序 内排序:排序过程中,待排序的所有记录全部放在内存中 外排序:排序过程中,使用到了外部存储. 通常讨论的都是内排序. 影响内排序算法性能的三个因素: 时间复杂度:即时间性能,高效

  • Python实现的数据结构与算法之快速排序详解

    本文实例讲述了Python实现的数据结构与算法之快速排序.分享给大家供大家参考.具体分析如下: 一.概述 快速排序(quick sort)是一种分治排序算法.该算法首先 选取 一个划分元素(partition element,有时又称为pivot):接着重排列表将其 划分 为三个部分:left(小于划分元素pivot的部分).划分元素pivot.right(大于划分元素pivot的部分),此时,划分元素pivot已经在列表的最终位置上:然后分别对left和right两个部分进行 递归排序. 其中

  • python冒泡排序算法的实现代码

    1.算法描述:(1)共循环 n-1 次(2)每次循环中,如果 前面的数大于后面的数,就交换(3)设置一个标签,如果上次没有交换,就说明这个是已经好了的. 2.python冒泡排序代码 复制代码 代码如下: #!/usr/bin/python# -*- coding: utf-8 -*- def bubble(l):    flag = True    for i in range(len(l)-1, 0, -1):        if flag:             flag = False

  • python 实现归并排序算法

    理论不多说: 复制代码 代码如下: #!/usr/bin/python import sys def merge(array, q, p, r): left_array = array[q:p+1] right_array = array[p+1:r+1] left_array_num = len(left_array) right_array_num = len(right_array) i, j , k= [0, 0, q] while i < left_array_num and j <

  • python 算法 排序实现快速排序

    QUICKSORT(A, p, r)是快速排序的子程序,调用划分程序对数组进行划分,然后递归地调用QUICKSORT(A, p, r),以完成快速排序的过程.快速排序的最差时间复杂度为O(n2),平时时间复杂度为O(nlgn).最差时间复杂度的情况为数组基本有序的时候,平均时间复杂度为数组的数值分布较为平均的时候.在平时情况下快速排序跟堆排序的时间复杂度都为O(nlgn),但是快速排序的常数项较小,所以要优于堆排序. PARTITION(A, p, r) 复制代码 代码如下: x ← A[r]

  • python实现的各种排序算法代码

    复制代码 代码如下: # -*- coding: utf-8 -*-# 测试各种排序算法# link:www.jb51.net# date:2013/2/2 #选择排序def select_sort(sort_array):    for i, elem in enumerate(sort_array):        for j, elem in enumerate(sort_array[i:]):            if sort_array[i] > sort_array[j + i]

  • python 实现插入排序算法

    复制代码 代码如下: #!/usr/bin/python def insert_sort(array): for i in range(1, len(array)): key = array[i] j = i - 1 while j >= 0 and key < array[j]: array[j + 1] = array[j] j-=1 array[j + 1] = key if __name__ == "__main__": array = [2, 4, 32, 64,

  • python实现冒泡排序算法的两种方法

    什么是冒泡排序? 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. 这个算法的名字由来是因为越大的元素会经由交换慢慢"浮"到数列的顶端,故名冒泡排序. 以上是百度词条对冒泡排序的官方解释. 但是我要说一下我的个人理解,我觉得冒泡排序的核心思想是:每次比较两个数,如果他们顺序错误(大于或者小于),那么就把

  • python选择排序算法的实现代码

    1.算法:对于一组关键字{K1,K2,-,Kn}, 首先从K1,K2,-,Kn中选择最小值,假如它是 Kz,则将Kz与 K1对换:然后从K2,K3,- ,Kn中选择最小值 Kz,再将Kz与K2对换.如此进行选择和调换n-2趟,第(n-1)趟,从Kn-1.Kn中选择最小值 Kz将Kz与Kn-1对换,最后剩下的就是该序列中的最大值,一个由小到大的有序序列就这样形成. 2.python 选择排序代码: 复制代码 代码如下: def selection_sort(list2):    for i in

  • Python实现的直接插入排序算法示例

    本文实例讲述了Python实现的直接插入排序算法.分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- '''直接插入的python实现 时间复杂度O(n**2) 空间复杂度O(1) 稳定 思想:先将前两个元素排序,第三个元素插入前面已排好序列, 后面的元素依次插入之前已经排好序的序列 ''' author = 'Leo Howell' L = [89,67,56,45,34,23,1] def direct_insert_sort(numbers): for i in

随机推荐