我的编程空间,编程开发者的网络收藏夹
学习永远不晚

记录python几个算法的实例分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

记录python几个算法的实例分析

记录python几个算法的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。


(一)插入排序

插入排序原址排序输入的数,算法在数组A中重排这些数,

在任何时候,最多只有常数个数字存储在数组外部。

插入排序是原地排序,基本无需外部空间。

从第二个元素开始,依次遍历全部数组。

其中,前半截为已排好的有序数组而后半截为待排序的无序数组。

每个元素从后向前依次对比,直到找到自己的位置。

插入排序是稳定排序。

def insert_sort(list1):
    for j in range(1,len(list1)): # 从第二个元素开始遍历,依次将元素放在指定位置
        key = list1[j] #记录当前值
        i = j -1 #将当前值从当前位置之前逆序依次比较
        while i>=0 and list1[i] >key:#如果当前值小于之前值,则说明当前值位于之前值的前面
            list1[i+1] = list1[i] #将大于当前值的元素依次后移一位,给当前值留位置
            i -=1
        list1[i+1] = key # 将当前值插入第一个小于它的值的后面
    return list1

if __name__ == "__main__":
    list1 = [380,22,64,75,327,98]
    list2 = ["wang","zhe","tian","jin","da","xue"]
    ordered_list1 = insert_sort(list1)
    ordered_list2 = insert_sort(list2)
    print(ordered_list1) #[2,3,4,5,6,7]
    print(ordered_list2) #['da']

(2)冒泡排序

冒泡排序原址排序输入的数,算法在数组A中重排这些数,

在任何时候,最多只有常数个数字存储在数组外部。

冒泡排序是原地排序,基本无需外部空间。

冒泡排序依次循环数组,每轮循环从前向后依次比较两个元素,排列使得后一个元素总是大于前一个元素。

因此,每轮循环可以保证当前未排序的列表中最大的元素放置在列表末尾。

即每轮循环后,可以使得未排序的列表长度减1。

重复直到列表仅剩唯一一个元素。

冒泡排序是稳定排序。

Python实现代码如下:

  1. # -*- coding: utf-8 -*-  
    def bubbleSort(bubbleList):  
        listLength = len(bubbleList)   #计算排序列表的长度  
        while listLength > 0:  
            for i in range(listLength - 1):  
                if bubbleList[i] > bubbleList[i+1]:  
                   temp = bubbleList[i+1]  
                   bubbleList[i+1] = bubbleList[i]  
                   bubbleList[i] = temp   #交换bubbleList[i]与bubbleList[i+1]的值  
            listLength -= 1   #每轮排序结束后,最后一个元素已经是最大的。因此只需要排前N-1个元素即可。  
        return bubbleList  
          
    if __name__ == '__main__':  
        list1 = [3,2,4,6,7,5]  
        list2 = ["wang", "zhe", "tian", "jin", "da", "xue"]  
        ordered_list1 = bubbleSort(list1)  
        ordered_list2 = bubbleSort(list2)  
        print(ordered_list1) #[2, 3, 4, 5, 6, 7]  
        print(ordered_list2) #['da', 'jin', 'tian', 'wang', 'xue', 'zhe'] 

(3)

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

归并排序是通过递归和合并来实现的。

即首先将一个列表分为两个字列表,字列表长度为1。然后在依次合并,使得合成的列表有序。

归并排序的时间复杂度是nlogn。空间复杂度是n。

归并排序是稳定排序。

Python的实现代码如下:

# -*- coding: utf-8 -*-  
def mergeSort(lists):  
    if len(lists) <= 1:  #当数组长度为1时,则无需排序。  
        return lists  
    num = int(len(lists) / 2)  #将一个数组分为两个部分  
    left = mergeSort(lists[:num])  #分别对左右两个部分进行排序  
    right = mergeSort(lists[num:])  
    return merge(left, right)   #将左右两个有序数组合并为一个有序数组  
      
def merge(left, right):  
    r, l = 0, 0  #初始化左右索引为0  
    result = []   #初始化结果列表  
    while l < len(left) and r < len(right): #当左右索引都尚未达到列表长度时。  
        if left[l] < right[r]:               #如果左列表的值小于右列表的值  
            result.append(left[l])           #将左列表当前值存入结果列表中  
            l += 1                           #左列表索引加1  
        else:  
            result.append(right[r])          #否则将右列表当前值存入结果列表中  
            r += 1                          #右列表索引加1  
    result += right[r:]                     #将剩余元素存入结果列表中  
    result += left[l:]  
    return result  
      
if __name__ == '__main__':  
    list1 = [3,2,4,6,7,5]  
    list2 = ["wang", "zhe", "tian", "jin", "da", "xue"]  
    ordered_list1 = mergeSort(list1)  
    ordered_list2 = mergeSort(list2)  
    print (ordered_list1) #[2, 3, 4, 5, 6, 7]  
    print (ordered_list2) #['da', 'jin', 'tian', 'wang', 'xue', 'zhe']

(4)

快速排序是指:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序在平均情况下时间复杂度为nlogn。

但是在最坏情况(本身为正序或者逆序时),时间复杂度为n*n。

快速排序是不稳定排序。即对于本身值相同的元素,在经过快速排序后,元素的先后位置可能会发生变化。

一趟快速排序的算法是:

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++),找到第一个大于key的A[i],将A[i]和A[j]互换;

5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

Python的实现方式如下:


# -*- coding: utf-8 -*-  
def quickSortFunction(L, low, high):  
    i = low     #i表示被排序列表的起点  
    j = high    #j表示被排序列表的终点  
    if i >= j: #若当起点和终点重合或起点在终点后时,则无需进一步排序  
        return L  
    key = L[i]       #将起点元素选为被对比元素  
    while i < j:                            #当起点与终点尚未重合时  
        while i < j and L[j] >= key:       #找到第一个小于key的元素的位置  
            j -= 1  
        L[i] = L[j]              #将第一个小于key元素的值放入key元素的位置  
        while i < j and L[i] <= key:   #找到第一个大于key元素值,放入刚才小于key元素的位置  
            i += 1  
        L[j] = L[i]  
    L[i] = key    #当i和j重合时,将key元素放置在重合位置。表示该位置前的元素都小于该元素,而该位置后的元素都大于该元素。  
    quickSortFunction(L, low, i-1)   #利用归并的方法继续对low到i-1和j+1到high的部分进行排序  
    quickSortFunction(L, j+1, high)  
    return L  
      
def quickSort(list1):              #调用quickSortFunction进行快速排序  
    return quickSortFunction(list1, 0, len(list1)-1)  #low和high分别为0和len-1,表示对列表整体进行快速排序  
      
if __name__ == '__main__':  
    list1 = [3,2,4,6,7,5,1,8,10,9]  
    list2 = ["wang", "zhe", "tian", "jin", "da", "xue"]  
    ordered_list1 = quickSort(list1)  
    ordered_list2 = quickSort(list2)  
    print (ordered_list1)             #[2, 3, 4, 5, 6, 7]  
    print (ordered_list2)             #['da', 'jin', 'tian', 'wang', 'xue', 'zhe']  


(5)堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。

可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。

在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

堆排序首先将待排序的数组存入堆中,并将堆构造为最大/最小堆。再依次从堆中取出堆顶元素,从而得到有序数组。

构造堆时,所用的方法为从最底层有子节点的节点开始依次向上处理。

取出顶元素恢复堆时则是先将末尾元素与顶元素交换位置,在对顶元素进行下沉处理即可。

堆排序是不稳定排序。即相同的元素再经过堆排序后,其先后位置可能发生变化。

堆排序的时间复杂度为N*logN。

Python的代码实现如下:

[python] view plain copy

  1. # -*- coding: utf-8 -*-  

  2. #用列表表示一个堆,其中列表中索引为0的位置为空。从索引1开始存放元素。  

  3. def parent(i):    #在堆中,某个节点的父节点为其索引值整除2。例如索引为4的父节点的索引为2。索引为9的父节点的索引为4。  

  4.     return i/2  

  5.   

  6. def left(i):     #某个节点的左子节点的索引为i*2  

  7.     return i*2  

  8.   

  9. def right(i):    #某个节点的右子节点的索引为i*2+1  

  10.     return i*2+1  

  11.   

  12. class Heap:     #堆的数据结构类  

  13.     def __init__(self, heapList=[None]):   #对堆进行初始化。没有给堆初始列表时,初始化为仅包含一个None元素的列表。  

  14.         self.heapList = [None] + heapList    #有初始化列表时,堆列表为初始化列表前插入None元素  

  15.   

  16.     def max_heapfy(self, i):   #表明对i节点进行最大堆恢复  

  17.         if (i*2) > self.length-1:   #该元素没有子节点时  

  18.             maxIndex = i  

  19.         elif (i*2+1) > self.length-1:   #该元素只有左节点时  

  20.             maxIndex = left(i)  

  21.         elif self.heapList[left(i)] > self.heapList[right(i)]:   #该元素同时有左右节点,且左节点的值大于右节点时  

  22.             maxIndex = left(i)  

  23.         else:    #该元素同时有左右节点,且左节点的值小于右节点时  

  24.             maxIndex = right(i)  

  25.         if self.heapList[i] < self.heapList[maxIndex]:   #当其子节点值大于其节点值时:  

  26.             self.heapList[i], self.heapList[maxIndex] = self.heapList[maxIndex], self.heapList[i]  

  27.             #交换其子节点的值和其值  

  28.             self.max_heapfy(maxIndex)  #并对其子节点进行最大堆化  

  29.   

  30.     def build_max_heap(self):      #构建最大堆  

  31.         self.length = len(self.heapList)    #计算堆的大小(包含第一个空元素)  

  32.         for i in range(self.length/2, 0, -1):  #从包含子节点的节点开始依次向上遍历  

  33.             self.max_heapfy(i)  

  34.   

  35.     def insert(self, k):   #向堆内插入元素  

  36.         self.length += 1    #堆的规模加1  

  37.         self.heapList.append(float("-inf"))   #向堆内插入一个负无穷的数  

  38.         self.increase_key(self.length, k)   #增加元素  

  39.   

  40.     def maxinum(self):    #查询堆内最大元素,即为索引为1的元素值。  

  41.         return self.heapList[1]  

  42.   

  43.     def extract_max(self):    #弹出堆内最大元素。  

  44.         maxValue = self.heapList[1]    #取得最大元素值  

  45.         self.heapList[1] = self.heapList[self.length]   #将末尾元素移至堆头  

  46.         del self.heapList[self.length]  #删除末尾元素  

  47.         self.length -= 1  #将堆的规模减1  

  48.         self.max_heapfy(1)   #对堆顶元素最大堆化  

  49.         return maxValue  

  50.   

  51.     def increase_key(self, x, k):   #增加元素  

  52.         self.heapList[x] = k   #将新增的负无穷位置赋予插入值  

  53.         while x > 1 and self.heapList[parent(x)] < self.heapList[x]: #当元素索引大于1且其值大于其父节点值  

  54.             self.heapList[parent(x)], self.heapList[x] = self.heapList[x], self.heapList[parent(x)]  

  55.             #交换其值和其父节点的值  

  56.             x = parent(x)  #继续对其父节点进行判断  

  57.   

  58.     def show(self):  #展示堆  

  59.         print "the length of queue is", self.length - 1  

  60.         print "the heapList is", self.heapList[1:]  

  61.   

  62. def heapSort(unsortedList):  

  63.     heap = Heap(unsortedList)   #将乱序列表转换为堆  

  64.     heap.build_max_heap()       #将堆构建为最大堆  

  65.     print heap.heapList  

  66.     print "*************heap has been build up*********"  

  67.     for i in range(len(unsortedList), 1, -1):  

  68.         heap.heapList[i], heap.heapList[1] = heap.heapList[1], heap.heapList[i]  #将末尾节点与根节点进行交换,  

  69.         #交换完成后,i位置的节点为当前堆中最大的元素。即每次循环中得到的i索引的元素为已有序的列表。  

  70.         heap.length -= 1   #未排序的堆的规模减小1  

  71.         heap.max_heapfy(1)    #此时,根节点不满足最大堆的要求,需要对堆进行最大堆恢复  

  72.     return heap.heapList[1:]  

  73.   

  74. if __name__ == '__main__':  

  75.     list1 = [3,2,4,6,7,5,1,8,10,9]  

  76.     list2 = ["wang", "zhe", "tian", "jin", "da", "xue"]  

  77.     ordered_list1 = heapSort(list1)  

  78.     ordered_list2 = heapSort(list2)  

  79.     print ordered_list1             #[2, 3, 4, 5, 6, 7]  

  80.     print ordered_list2             #['da', 'jin', 'tian', 'wang', 'xue', 'zhe'] 

看完上述内容,你们掌握记录python几个算法的实例分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

记录python几个算法的实例分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

记录python几个算法的实例分析

记录python几个算法的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(一)插入排序插入排序原址排序输入的数,算法在数组A中重排这些数,在任何时候,最多只有常数个数字
2023-06-04

Python图算法实例分析

本文实例讲述了Python图算法。分享给大家供大家参考,具体如下:#encoding=utf-8 import networkx,heapq,sys from matplotlib import pyplot from collection
2022-06-04

JVM的GC日志记录实例分析

本文小编为大家详细介绍“JVM的GC日志记录实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“JVM的GC日志记录实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Java应用的GC评估可能大多数程序员
2023-06-29

Python中算法的示例分析

小编给大家分享一下Python中算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 算法的设计要求算法分析的主要目标是从运行时间和内存空间消耗等方面
2023-06-22

python算法题的示例分析

这篇文章将为大家详细讲解有关python算法题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。题目描述:编写一个算法来确定一个数字是否“快乐”。 快乐的数字按照如下方式确定:从一个正整数开始,用其
2023-06-15

Python聚类算法之DBSACN实例分析

本文实例讲述了Python聚类算法之DBSACN。分享给大家供大家参考,具体如下: DBSCAN:是一种简单的,基于密度的聚类算法。本次实现中,DBSCAN使用了基于中心的方法。在基于中心的方法中,每个数据点的密度通过对以该点为中心以边长为
2022-06-04

Python快速排序算法实例分析

本文实例讲述了Python快速排序算法。分享给大家供大家参考,具体如下: 快速排序的时间复杂度是O(NlogN) 算法描述: ① 先从序列中取出一个数作为基准数 ② 分区过程, 将比这个数大的数全部放到它的右边, 小于或等于它的数全部放到它
2022-06-04

Python深度学习算法实例分析

本篇内容主要讲解“Python深度学习算法实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python深度学习算法实例分析”吧!最小二乘法所有的深度学习算法都始于下面这个数学公式(我已将其
2023-06-03

python中PTD算法的示例分析

小编给大家分享一下python中PTD算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.引言1.1什么是地面点滤波?机载激光雷达(airborne
2023-06-20

python之CSF算法的示例分析

这篇文章给大家分享的是有关python之CSF算法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. 引言机载LiDAR可以获取快速、低成本地获取大区域的高精度地形测量值。为了获取高精度的地形数据(厘米
2023-06-20

java中的char占几个字节实例分析

java中的char占几个字节实例分析 1:“字节”是byte,“位”是bit ;  2: 1 byte = 8 bit ;  char 在Java中是2个字节。java采用unicode,2个字节(16位)来表示一个字符。  
2023-05-31

Python中K-means算法的示例分析

这篇文章主要介绍了Python中K-means算法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、步骤说明(1)确定K值(决定数据聚为几类,K值是K-Means算
2023-06-15

Python实现的堆排序算法原理与用法实例分析

本文实例讲述了Python实现的堆排序算法。分享给大家供大家参考,具体如下: 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的
2022-06-04

python数据结构算法的示例分析

小编给大家分享一下python数据结构算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.算法分析的定义有这样一个问题:当两个看上去不同的程序 解决同
2023-06-22

Python实现的基数排序算法原理与用法实例分析

本文实例讲述了Python实现的基数排序算法。分享给大家供大家参考,具体如下: 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,
2022-06-04

Python实现希尔排序算法的原理与用法实例分析

本文实例讲述了Python实现希尔排序算法的原理与用法。分享给大家供大家参考,具体如下: 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。 希尔排序的基本思想是:先将整个待排元素
2022-06-04

python数据挖掘算法的示例分析

这篇文章给大家分享的是有关python数据挖掘算法的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、首先简述数据挖掘的过程第一步:数据选择可以通过业务原始数据、公开的数据集、也可通过爬虫的方式获取。第二
2023-06-29

Android笔记之:App调试的几个命令的实践与分析

在Android的应用开发中,我们会用到各种代码调试;其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面我把握工作中碰到的几个常用命令和方法给大
2022-06-06

Python高级数据结构与算法实例分析

本文小编为大家详细介绍“Python高级数据结构与算法实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python高级数据结构与算法实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、简介我们将从以
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录