冒泡、选择、插入、归并、希尔等排序算法的Python实现

一,冒泡排序

时间复杂度:O(n2)

稳定性:稳定

  冒泡排序我就不多讲了,大体上就是比较相邻的两个数,每次把较大的数沉底。流程图大致上如下:

  图是截得别人的,只是说明一下,代码没有参看别人的,写的不好,有更好的写法可以一起探讨。下面是代码:

 1 def bubble(list):
 2     #print(list)
 3     for index in range(1,len(list)):  #比较6趟
 4         print("    index: %d" %index)
 5         for index2 in range(len(list)-1,0,-1):
 6             print("index2 =  %d:" %index2)
 7             if list[len(list) - index2-1] > list[len(list) - index2]:
 8                 temp = list[len(list) - index2-1]
 9                 list[len(list) - index2 - 1] = list[len(list) - index2]
10                 list[len(list) - index2] = temp
11         print(list)
12 list = [3, 6, 4, 2, 11, 10, 5,12,1,7,10]
13 bubble(list)

这里添加了新的解法(2019.6.25):

‘‘‘
若list长度为n则迭代n-1次,每次迭代只要有前面大于后面便交换
‘‘‘
def buble_sort(list):

    n = 1
    while len(list)-n:
        for i in range(len(list)-1):
            if list[i] > list[i+1]:
                list[i],list[i+1] = list[i+1],list[i]
        n +=1
        print(n-1,":",list)

l = [3,6,4,2,11,10,5,1]
buble_sort(l)

二,选择排序

时间复杂度:O(n2)

稳定性:不稳定

如:8,9,8,6,7中第四个数6位最小的,将与第一个8交换,这时候第一个8就变为了第二个了,因此不稳定。

  选择排序大体上就是每次在列表中找出最小的数,拿出来,然后再把拿出最小值后的列表在找最小数,就是这个思路。如图:

 1 def xuanze(list):
 2     list2 = []
 3     for index in range(1,len(list)):
 4         print("第 %d 次排序list,list2分别为:" %index)
 5         min = list[0]   #最小值
 6         for i in list:  #这里的i是里面的数值,而不是序号,print(i)可验证
 7             #print(i)
 8             if i < min:
 9                 min = i
10         #print(list.index(min))   #知道值求位置
11         locate = list.index(min)  #最小值的序号
12         temp = list[0]        #以下三行是交换
13         list[0] = list[locate]
14         list[locate] = temp
15
16         print(list)
17         list2.append(list[0])
18         list.remove(list[0])
19         ‘‘‘当交换位置后的list第一个值被remove出去后,
20         此时的list是[56,80,91,20]了,依此类推,这里是
21         本算法利用list最好玩的地方,可以少写一个for‘‘‘
22         print(list2)
23
24     print("最终的list2:")
25     list2.append(list[0])
26     print(list2)
27 if __name__ == ‘__main__‘:
28     list = [56,12,80,91,20,33,89,99]
29     xuanze(list)

17:06:26  2018-05-24

这里添加了新的解法(2019.6.25):

def selection_sort(list):
    new_list = []
    while len(list):
        min = list[0]
        for i in range(0,len(list)):
            if list[i] < min:
                min= list[i]
        new_list.append(min)
        list.remove(min)
    print(new_list)

l = [10,6,7,11,8,3]
selection_sort(l)

三,插入排序

时间复杂度:O(n2)

稳定性:稳定

基本就是这个样子吧,看示意图能看明白,不再赘述。代码如下:

 1 def charu(list):
 2     num = len(list)
 3     for i in range(1,num):
 4         for j in range(0,i):
 5             print("i=",i,"j=",j,"      list[i]=",list[i],"list[j]=",list[j])
 6             if list[i] < list[j]:
 7                 temp = list[i]
 8                 list.remove(list[i])
 9                 list.insert(j,temp)
10                 print(list)
11                 break
12 list = [3,44,39,5,47,15,36,26,27,2,46,4,19,50,48]  #13个数
13 charu(list)

这里添加了新的解法(2019.6.26):

def  insertion_sort(list):
    for i in range(1,len(list)):
        for j in range(0,i):
            temp = list[i]
            if temp < list[j]:
                list.pop(i)
                list.insert(j,temp)
    return list

l = [3,44,39,5,47,15,36,26,27,2,46,4,19,50,48]
insertion_sort(l)

四,归并排序

O(n*logn),稳定

归并用到了分治的思想。

def merge_sort(list):
    if len(list) == 1:
        return list
    else:
        mid = len(list)//2  #地板除
        left = list[:mid]
        right = list[mid:]
        return merge(left,right)
#合并两个排好的list
def merge(left,right):
    left.extend(right)
    sort_list = sorted(left)
    return sort_list

result = merge_sort([9,1,7,3,4,8,2,6])
print(result)

五,快速排序

O(n*logn)  不稳定

引用:https://blog.csdn.net/morewindows/article/details/6684558

‘‘‘
基本思想:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。
‘‘‘
def quick_sort(list):
    if len(list) == 1:
        return list
    else:
        base = list[0]
        left = []
        right = []
        for i in list:
            if i>=base:
                right.append(i)
            else:
                left.append(i)
        return combine(left,right)
#合并两个排好的list
def combine(left,right):
    left.extend(right)
    sort_list = sorted(left)
    return sort_list

l = [5,1,7,3,4,45,0,2,6]
result = quick_sort(l)
print(result)

六,希尔排序

不稳定

def shell_sort(list,gap):    #导入的list的长度    length = len(list)    #gap为0则停止,不为0则继续迭代    if gap == 0:        return list    else:        #list_container用于装按照gap打散(分组)后的列表        list_container = []        for i in range(0,gap):            temp_list = []            for j in range(i,length,gap):                temp_list.append(list[j])            # print(temp_list)            list_sep = sort(temp_list)            list_container.append(list_sep)        print("按照对应gap划分出的列表:",list_container)

        sorted_list = sort_all_list(list_container, length, gap)        print("调用sort_all_list后:",sorted_list)        #gap减小以达到最终迭代终止条件        gap = gap//2        #最后调用自己以迭代        return shell_sort(sorted_list, gap)

def sort(list1):    return sorted(list1)#把按照gap打散(分组)后的列表排到一个理好顺序的list中def sort_all_list(list2,length,gap):    new_list = []    for mm in range(length):        new_list.append(0)    #把l2每个数组按照每隔gap组成一个new_list    for list in list2:        N = list2.index(list)        for i in range(N,length,gap):            num = int((i-N)/gap)            new_list[i] = list[num]    # print("sort_all_list:",new_list)    return new_list

l = [9,1,3,6,87,12,64,9,11,65,7]#初始gapif len(l) % 2 == 0:    gap = int(len(l) / 2)else:    gap = int((len(l) - 1) / 2)shell_sort(l,gap)

原文地址:https://www.cnblogs.com/two-peanuts/p/9083375.html

时间: 2024-08-02 16:52:11

冒泡、选择、插入、归并、希尔等排序算法的Python实现的相关文章

python 数据结构与算法之排序(冒泡,选择,插入)

目录 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 数据结构与算法: 算法: 数据结构 冒泡排序法 选择排序法 插入排序法 数据结构与算法之排序(冒泡,选择,插入) 为什么学习数据结构与算法: 计算机重要的几门课: 1.数据结构和算法 2.网络 3.操作系统 4.计算组成原理 数据结构与算法: 算法: 衡量算法的标准: 时间复杂度:就是程序代码执行的大概次数 小结: 时间复杂度是用来估计算法运行时间的一个式子(单位) 一般来说,时间复杂度高的算法比复杂度低的算法慢 常见的

常用排序算法的python实现和性能分析

http://www.cnblogs.com/wiki-royzhang/p/3614694.html 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试题整了一下,可以阶段性的留下些脚印——没办法,平时太忙,基本上没有时间写博客.面试测试开发的话,这些也许能帮得上一些. 这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数

几种常用排序算法的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++),找到第一个大

冒泡 选择 插入 希尔 堆 归并 快速 排序算法

排序相关概念 排序:对一序列对象根据某个关键字进行排序: 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面: 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排序操作都在内存中完成: 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行: 排序耗时的操作:比较.移动: 排序分类: (1)交换类:冒泡排序.快速排序:此类的特点是通过不断的比较和交换进行排序: (2)插入类:简单插入排序.希尔排序:此类的特点是通过插入的

八大排序算法的python实现(八)简单选择排序

代码: #coding:utf-8 #author:徐卜灵 # L = [6, 3, 2, 32, 5, 4] def Select_sort(L): for i in range(0,len(L)): for j in range(i,len(L)): if L[i] > L[j]: #打擂台的形式 # temp = L[i] # L[i] = L[j] # L[j] = temp # L[i],L[j] = L[j],L[i] return L print Select_sort(L) 这个

八大排序算法的 Python 实现

插入排序: 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素).在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中. 1 def insert_sort(lists): 2 count = len(

常用排序算法的python实现

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

八大排序算法---基于python

本文节选自:http://python.jobbole.com/82270/ 本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的.个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2).是稳定的排序方法.插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),

基本排序算法的Python实现

本篇主要实现九(八)大排序算法,分别是冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序,计数排序.希望大家回顾知识的时候也能从我的这篇文章得到帮助. 为了防止误导读者,本文所有概念性内容均截取自对应Wiki 冒泡排序 原理 冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢