Python之基本排序算法的实现

 1 import cProfile
 2 import random
 3 class SortAlgorithm:
 4     def __init__(self,unsortedlist=[]):
 5         self.unsortedlist = unsortedlist or [i for i in random.sample(range(10000),100)]
 6         self.length = len(self.unsortedlist)
 7
 8     def bubble_sort(self):
 9         ‘‘‘
10         冒泡排序:从第一个元素开始,每每相邻的两个元素进行比较,若前者比后者大则交换位置。最后两个相邻元素比较完成后,最大的元素形成,
11         然后再次从头开始进行比较,若元素个数为n个,则总共需要进行n-1轮比较就可完成排序。一般情况下算法复杂度是平方级。
12         ‘‘‘
13         for i in range(self.length-1):
14             for j in range(self.length-i-1):
15                 if self.unsortedlist[j]>self.unsortedlist[j+1]:
16                     self.unsortedlist[j],self.unsortedlist[j+1] = self.unsortedlist[j+1],self.unsortedlist[j]
17
18         return self.unsortedlist
19
20     def selection_sort(self):
21         ‘‘‘
22         选择排序:从未排序的序列中找到一个最小的元素,放到第一位,再从剩余未排序的序列中找到最小的元素,放到第二位,依此类推,直到所有元素都已排序完毕。
23         假设序列元素总共n个,则我们需要找n-1轮,就可以使该序列排好序。时间复杂度是平方级。
24         ‘‘‘
25         for i in range(self.length-1):
26             for j in range(i+1,self.length):
27                 if self.unsortedlist[i]>self.unsortedlist[j]:
28                     self.unsortedlist[i],self.unsortedlist[j] = self.unsortedlist[j],self.unsortedlist[i]
29         return self.unsortedlist
30
31     def insert_sort(self):
32         ‘‘‘
33         插入排序:把序列的第一个元素当成已排序列表中的元素,接着从第二个元素开始,与已排序列表中的元素一一比较,并放到合适的位置。假设有n个元素需要排序,则需要n-1轮插入就可排好序。
34         时间复杂度为平方级。
35         ‘‘‘
36         for i in range(1,self.length):
37             for j in range(i):
38                 if self.unsortedlist[i]<self.unsortedlist[j]:
39                     self.unsortedlist.insert(j,self.unsortedlist.pop(i))
40                     break
41         return self.unsortedlist
42
43     def merge_sort(self,lists=None,divid=None):
44         ‘‘‘
45         归并排序:归并排序是约翰·冯·诺伊曼发明,是一种典型的分治法(Divide and Conquer),把一个无序列表一分为二,对每个子序列再一分为二,继续下去,直到无法再进行划分为止。
46         然后,就开始合并的过程,对每个子序列和另外一个子序列的元素进行比较,依次把小元素放入结果序列中进行合并,最终完成归并排序。时间复杂度是线性对数级。
47         ‘‘‘
48         lists = lists or self.unsortedlist
49         if len(lists)<=1:
50             return lists
51         divid = divid or len(lists)//2
52         left_list = self.merge_sort(lists=lists[:divid])
53         right_list = self.merge_sort(lists=lists[divid:])
54
55         result = []
56         l,r=0,0
57         while len(left_list)>l and len(right_list)>r:
58             if left_list[l]<right_list[r]:
59                 result.append(left_list[l])
60                 l+=1
61             else:
62                 result.append(right_list[r])
63                 r+=1
64         result+=left_list[l:]
65         result+=right_list[r:]
66         return result
67
68     def quick_sort(self,lists=None):
69         ‘‘‘
70         快速排序:快速排序也是一种分治思想,基本思想是先随便在无序列表中找一个元素,以这个元素为基准,其他所有元素都跟该元素比,比该元素小的成为一个子序列,比该元素大的成为另一个子序列,
71         这样其中一部分数据都比另一部分小,然后再按照此方法分别进行快速排序,最终达到排序效果。时间复杂度一般为线性对数级。
72         ‘‘‘
73         lists = lists or self.unsortedlist
74         if len(lists)<=1:
75             return lists
76         small = []
77         large = []
78         divid = lists.pop(0)
79         for each in lists:
80             if each<divid:
81                 small.append(each)
82             else:
83                 large.append(each)
84         self.quick_sort(small)
85         self.quick_sort(large)
86         return self.quick_sort(small)+[divid]+self.quick_sort(large)
87
88
89 if __name__==‘__main__‘:
90     sort = SortAlgorithm()
91     #result = sort.bubble_sort()
92     #result = sort.selection_sort()
93     #result = sort.insert_sort()
94     #result = sort.merge_sort()
95     result = sort.quick_sort()
96     print(result)
时间: 2024-08-24 18:04:00

Python之基本排序算法的实现的相关文章

Python - 几种排序算法的实现

直接插入.选择排序.冒泡排序.快速排序.……归并排序.基数排序.希尔.堆排序. 直接插入: 思想是:1.将数据序列分成两部分,前一部分是有序的,后面一部分是无序的. 2.将无序变有序,首先从第一开始,然后第一,第二比较后排序,此时这两位就是有序的了:然后从无序的队列中取出第三位和第二位比较,然后他们中矮的再和第一位比较,此时三位是有序的: 然后再取出第四位,和前面的比较……,一直到最后一位比较. def insert_sort(aList): n = len(aList) for i in ra

Python 排序算法的实现

冒泡排序: 1 def bubble(l): 2 length = len(l) 3 for i in range(length): 4 for j in range(i+1, length): 5 if l[i] > l[j]: 6 l[i], l[j] = l[j], l[i] 7 print l 选择排序: 1 def select(l): 2 length = len(l) 3 for i in range(length): 4 minn = i 5 for j in range(i+1

Python学习(三) 八大排序算法的实现(下)

本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

七种排序算法的实现和总结

最近把七种排序算法集中在一起写了一遍. 注释里有比较详细的说明. 1 /*排序算法大集合**/ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 //------------------快速排序------------------// 7 /* 8 核心: 9 如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置. 10 算法: 11 1.选取分界数,参考这个分界数,

软考笔记第六天之各排序算法的实现

对于前面的排序算法,用c#来实现 直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序.第一趟比较前两个数,然后把第二个数按大小插入到有序表中: 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中:依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程.直接插入排序属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1).直接插入排序是由两层嵌套循环组成的.外层循环标识并决定待比较的数值.内层循环为待比较数值确定其最终位

常见排序算法的实现(归并排序、快速排序、堆排序、选择排序、插入排序、希尔排序)

这篇博客主要实现一些常见的排序算法.例如: //冒泡排序 //选择排序 //简单插入排序 //折半插入排序 //希尔排序 //归并排序 //双向的快速排序 //单向的快速排序 //堆排序 对于各个算法的实现原理,这里不再多说了,代码中注释较多,结合注释应该都能理解算法的原理,读者也可自己google一下.另外,注释中有很多点,比如边界条件.应用场景等已经用 * 标记,* 越多,越应该多注意. 下面是实现: //冒泡排序 void BubbleSort(int *arr, int n) { if(

排序算法的实现(归并,快排,堆排,希尔排序 O(N*log(N)))

今天跟着左老师的视频,理解了四种复杂度为 O(N*log(N))的排序算法,以前也理解过过程,今天根据实际的代码,感觉基本的算法还是很简单的,只是自己写的时候可能一些边界条件,循环控制条件把握不好. //对于一个int数组,请编写一个选择冒泡算法,对数组元素排序. //给定一个int数组A及数组的大小n,请返回排序后的数组. //测试样例: //[1, 2, 3, 5, 2, 3], 6 //[1, 2, 2, 3, 3, 5] #include <iostream> using namesp

数据结构实验4(排序算法的实现及性能分析)

实现了选择排序, 插入排序, 冒泡排序, 快速排序, 改进后的快速排序, 以及两路合并排序. 通过随机函数随机生成100个数, 进行各种排序, 记录排序开始时间以及结束时间, 计算消耗的时间来比较算法的优略. 实现代码: #include "iostream" #include "cstdio" #include "cstring" #include "algorithm" #include "queue"