python八大排序算法

print("冒泡排序")
def bubbleSort(input_list):
    ‘‘‘
    函数说明:冒泡排序(升序)
    :param input_lis: 待排序列表
    :return:sorted_list :升序排好的列表
    ‘‘‘
    if len(input_list) == 0:
        return []
    sorted_list = input_list
    for i in range(len(sorted_list)-1):
        bchanged =False
        # print("第%d趟排序:"%(i-1))
        for j in range(len(sorted_list)-1):
            if sorted_list[j + 1] < sorted_list[j]:
                sorted_list[j],sorted_list[j+1] = sorted_list[j+1],sorted_list[j]
                bchanged =True
            # print(sorted_list)
        if not bchanged :
            break
    return sorted_list
if __name__ == ‘__main__‘:
    input_list =[50,2,4,5,99,44,33,66,77,88]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)

print("-"*50)
print(‘直接插入排序‘)
def inserSort(input_list):
    ‘‘‘
    函数说明:直接插入排序
    :param input_list:  待排序的列表
    :return: sorted_list 排序号的列表
    ‘‘‘
    if len(input_list) == 0 :
        return []
    sorted_list =input_list
    for i in range(1,len(sorted_list)):
        temp = sorted_list[i]
        j = i -1
        while j >=0 and temp < sorted_list[j]:
            sorted_list[j+1] = sorted_list[j]
            j -=1
            sorted_list[j+1] = temp
        return sorted_list
if __name__ == ‘__main__‘:
    input_list = [6,4,8,9,2,3,1]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)

print("-"*50)
print("希尔排序")

def shellSort(input_list):
    length =len(input_list)
    if length <=1:
        return input_list
    sorted_list = input_list
    gap = length // 2
    while gap > 0 :
        for i in range(gap,length):
            j = i -gap
            temp = sorted_list[i]
            while j >= 0 and temp < sorted_list[j]:
                sorted_list[j +gap] = sorted_list[j]
                j -=gap
            sorted_list[j + gap] = temp
        gap //= 2
    return sorted_list
if __name__ == ‘__main__‘:
    input_list = [50,123,53,154,34,6,7,46,78,67]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)

print("-"*50)
‘‘‘快速排序‘‘‘

def QuickSort(input_list , left,right):
    ‘‘‘
    函数说明:快速排序(升序)
    :param input_list:
    :param left:
    :param right:
    :return:
    ‘‘‘
    def division(input_list,left,right):
        ‘‘‘
        函数说明:根据left和right进行一次扫描,重新找到基准数
        :param input_list: 待排序列
        :param left: 左指针位置
        :param right: 右指针位置
        :return: left 新的基准位置
        ‘‘‘
        base =input_list[left]
        while left < right :
            while left < right and input_list[right] >=base:
                right -=1
            input_list[left] =input_list[right]
            while left < right and input_list[left] <=base :
                left +=1
            input_list[right] = input_list[left]
        input_list[left] = base
        return left
    if left < right :
        base_index = division(input_list,left,right)
        QuickSort(input_list,left,base_index - 1)
        QuickSort(input_list,base_index + 1,right )
if __name__ == ‘__main__‘:
    input_list = [6,3,4,6,7,8,2,1]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)

print("-"*50)
print("简单选择排序")
def Selectsort(input_list):
    ‘‘‘
    函数说明:简单选择排序(升序)
    :param input_list: 待排序列表
    :return: sortde_list : 升序排好序的列表
    ‘‘‘
    if len(input_list) == 0 :
        return []
    sorted_list =input_list
    length = len(sorted_list)
    for i in range(length):
        min_index = 1
        for j in range(i + 1 ,length):
            if sorted_list[min_index] > sorted_list[j]:
                min_index = j
            temp =sorted_list[i]
            sorted_list[i] = sorted_list[min_index]
            sorted_list[min_index] = temp
        return sorted_list
if __name__ =="__main__":
    input_list =[4,3,1,6,7,8,9,5,2]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)

print("-"*50)
print("堆序列")

def HeadSort(input_list):
    ‘‘‘
    函数说明:堆排序(升序)
    :param input_list: 待排序列表
    :return: sorted_list:升序排序好的列表
    ‘‘‘
    def HeadAdjust(input_list,parent,length):
        ‘‘‘
        函数说明:堆调整,调整为最大堆
        :param input_list: 待排序列表
        :param parent: 堆的父节点
        :param length:  数组长度
        :return: 无
        ‘‘‘
        temp = input_list[parent]
        child = 2*parent +1
        while child < length :
            if child +1 <length and input_list[child]<input_list[child+1]:
                child +=1
            if temp >=input_list[child]:
                break
            input_list[parent] = input_list[child]
            parent =child
            child = 2 *parent +1
        input_list[parent] = temp
    if len(input_list) == 0 :
        return []
    sorted_list =input_list
    length =len(sorted_list)
    for i in range(0,length // 2 +1 )[::-1]:
        HeadAdjust(sorted_list,i ,length)
    for j in range(1,length)[::-1]:
        temp =sorted_list[j]
        sorted_list[j] = sorted_list[0]
        sorted_list[0] = temp
        HeadAdjust(sorted_list,0,j )
        print("第%d趟排序:"%(length-j ),end="")
        print(sorted_list)
    return sorted_list
if __name__ == ‘__main__‘:
    input_list = [3,5,6,7,8,21,2,1]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)

print("-"*50)
print("归并排序")

def MergeSort(input_list):
    ‘‘‘
    函数说明:归并排序(升序)
    :param input_list: 待排序列表
    :return: sorted_list:升序排序好的列表
    ‘‘‘
    def merge(input_list,left,mid,right,temp):
        ‘‘‘
        函数说明:合并函数
        :param input_list:待合并列表
        :param left: 左指针
        :param mid:
        :param right:右指针
        :param temp: 临时列表
        :return:
        ‘‘‘
        i = left
        j = mid +1
        k = 0
        while i <= mid and j <= right :
            if input_list[i] <= input_list[j]:
                temp[k] = input_list[i]
                i +=1
            else:
                temp[k] = input_list[j]
                j +=1
            k +=1
        while i <= mid:
            temp[k] = input_list[i]
            i +=1
            k +=1
        while j <=right:
            temp[k] = input_list[j]
            j +=1
            k +=1
    def merge_sort(input_list,left,right,temp):
        if left >= right:
            return
        mid = (right + left) //2
        merge_sort(input_list,left,mid,temp)
        merge_sort(input_list,mid+1,right,temp)
        merge(input_list,left,mid,right,temp)
    if len(input_list) == 0 :
        return []
    sorted_list = input_list
    temp = [0]* len(sorted_list)
    merge_sort(sorted_list,0,len(sorted_list)-1,temp)
    return sorted_list
if __name__ == ‘__main__‘:
    input_list = [3,5,6,2,1,0,4,8,9]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)

print("-"*50)
print("基数排序")

def RadixSort(input_list):
    ‘‘‘
    函数说明:基数排序(升序)
    :param input_list:  待排序列表
    :return: sorted_list 升序排序好的列表
    ‘‘‘
    def MaxBit(input_list):
        ‘‘‘
        函数说明:求出数组中最大数的位数的函数
        :param input_list: 待排序列表
        :return: bits_num 位数
        ‘‘‘
        max_data = max(input_list)
        bits_num = 0
        while max_data :
            bits_num +=1
            max_data //= 10
        return bits_num
    def digit(num,d):
        ‘‘‘
        函数说明:取数xxx数上的第d位数字
        :param num: 带操作的数
        :param d: 第d位的数
        :return: 取数结果
        ‘‘‘
        p = 1
        while d > 1 :
            d -=1
            p *=10
            return num // p % 10
        if len(input_list) ==0:
            return []
        sorted_list = input_list
        lenght = len(sorted_list)
        bucket = [0]*lenght
        for i in range(1,MaxBit(sorted_list)+1):
            count =[0]*10
            for i in range(0,lenght):
                count[i] += count[i -1]
            for i in range(0,lenght)[::-1]:
                k = digit(sorted_list[i],d)
                bucket[count[k]-1] = sorted_list[i]
                count[k] -=1
            for i in range(0,lenght):
                sorted_list[i] =bucket[i]
        return sorted_list
if __name__ == ‘__main__‘:
    input_list =[50,123,543,134,5,76,8,6,9,89,56,45]
    print("排序前",input_list)
    sorted_list = bubbleSort(input_list)
    print("排序后",sorted_list)

原文地址:https://www.cnblogs.com/zhaoyang110/p/9513774.html

时间: 2024-10-02 08:42:00

python八大排序算法的相关文章

算法基础——经典八大排序算法的Java及Python实现

概述 八大排序算法不用多说了,程序员算法基础必须要掌握的,现在总结一下加深记忆.下图是这八大排序算法的分类.名称.时间空间复杂度,以及稳定性. 代码 以下是经典八大排序算法的Java及Python代码,都是基于经典算法书籍<算法导论>里的伪代码实现的,我在关键语句部分附上了注释. 按照上图中的顺序分别介绍八大排序算法的实现(升序),前面是Java,后面是Python.Java的排序函数写在了一个类里,Python的排序函数则直接写出来了. 直接插入排序 public class InsertS

Python实现八大排序算法

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

数据结构常见的八大排序算法(详细整理)

https://www.jianshu.com/p/7d037c332a9d?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-friends 八大排序,三大查找是<数据结构>当中非常基础的知识点,在这里为了复习顺带总结了一下常见的八种排序算法.常见的八大排序算法,他们之间关系如下: 排序算法.png 他们的性能比较: 性能比较.png 下面,利用Python分别将他

谈谈八大排序算法问题

排序算法可以说是算法的入门以及算法学习阶段的基石,排序算法显得那么的基础又是非常重要的一种算法.排序算法常常作为一些高阶算法的数据处理中间过程在实际的问题处理中被应用的最为广泛,因此算法选将阶段就从八大排序算法开始.在本节内容中既可以看到一般性的比如插入排序,冒泡排序等基础算法又可以看到比如基数排序,位图排序,快速排序等等比较难理解的算法,算法之门从排序算法说起. 1.插入排序 插入排序算法的原理很简单,默认A中有一部分数据已经排好序了,后续只要从没有排好序的序列里面每拿出一个数字就在排好序的序

八大排序算法源码 + 耗时长度比较(看到好东西转下)

八大排序算法的排序时间长度的比较,测试数据10000000时部分结果如下 输入测试数据长度: 10000000数据初始化中...数据初始化完成!        堆排序用时:    8秒 499毫秒      快速排序用时:   22秒  35毫秒      归并排序用时:   34秒 473毫秒 另外五种排序本人并未等待结果,读者可自行测试 测试时请注意内存消耗,以免数据太大,内存不够,可自行测试单一算法以便增加可测试数据数目 #include <iostream> #include <

数据结构与算法之——八大排序算法

附:关于这个主题,网上好的文章已经数不胜数,本篇是整合后的文章. 正文: 一.概述 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 本文所指八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 二.排序算法详述 1.

[Data Structure] 八大排序算法

排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.我们这里说的八大排序算法均为内部排序. 下图为排序算法体系结构图: 1. 直接插入排序(Straight Insertion Sort ) 基本思想:将待排序的无序数列看成是一个仅含有一个元素的有序数列和一个无序数列,将无序数列中的元素逐次插入到有序数列中,从而获得最终的有序数列. 算法流程: 1)初始时, a[0]自成一个有序区, 无序区为a[1

(转)详解八大排序算法

概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序.堆排序或归并排序序. 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短: 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 将一个记录插入到

排序算法(九)——八大排序算法总结

八大排序算法的稳定性及复杂度总结如下: 选择排序算法准则 每种排序算法都各有优缺点.因此,在实用时需根据不同情况适当选用,甚至可以将多种方法结合起来使用. 影响排序的因素有很多,平均时间复杂度低的算法并不一定就是最优的.相反,有时平均时间复杂度高的算法可能更适合某些特殊情况.同时,选择算法时还得考虑它的可读性,以利于软件的维护.一般而言,需要考虑的因素有以下四点: 1.待排序的记录数目n的大小: 2.记录本身数据量的大小,也就是记录中除关键字外的其他信息量的大小: 3.关键字的结构及其分布情况: