python 代码排布_python实现经典排序算法的示例代码

以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想。

冒泡排序

内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后会将次大的元素移到最大元素的左边,每次内层循环结束都会将一个元素排好序。

def bubble_sort(arr):

length = len(arr)

for i in range(length):

for j in range(length - i - 1):

if arr[j] > arr[j + 1]:

arr[j], arr[j + 1] = arr[j + 1], arr[j]

return arr

选择排序

每次内层循环都会得到一个当前最小的元素,并将其放到合适的位置。内层循环第一次结束后会将最小的元素交换到序列首位,第二次结束后会将第二小的元素交换到序列第二位,每次内层循环结束后都会将一个元素放在正确的顺序位置。

def selection_sort(arr):

length = len(arr)

for i in range(length):

min_index = i

for j in range(i + 1, length):

if arr[j] < arr[min_index]:

min_index = j

arr[i], arr[min_index] = arr[min_index], arr[i]

return arr

插入排序

类比玩扑克牌时理牌的思想,从第一个元素开始,假设它是已经排好序的。然后开始处理第二个元素,如果比第一个元素小,则将其放到第一个元素左边,否则放在其右边,那么现在前两个元素以及排好序了,之后再依次处理剩余的元素。

def insertion_sort(arr):

length = len(arr)

for i in range(1, length):

pre = i - 1

current_value = arr[i]

while pre >= 0 and arr[pre] > current_value:

arr[pre + 1] = arr[pre]

pre -= 1

arr[pre+1] = current_value

return arr

希尔排序

希尔排序就是将插入排序的改进版本。插入排序中每次逐步比较元素,而希尔排序中则是从一个较大的步数开始比较,最后减小到一步。

def shell_sort(arr):

length = len(arr)

gap = length // 2

while gap > 0:

for i in range(gap, length):

pre = i - gap

current_value = arr[i]

while pre >= 0 and arr[pre] > current_value:

arr[pre + gap] = arr[pre]

pre -= gap

arr[pre + gap] = current_value

gap = gap // 2

return arr

归并排序

先将序列前半部分排好序,再将序列后半部分排好序,之后再将这两部分合并得到最终的序列,具体实现为递归地将序列分为两部分,分别排序后再合并。

def merge(left, right):

result = []

while len(left) > 0 and len(right) > 0:

if left[0] < right[0]:

result.append(left.pop(0))

else:

result.append(right.pop(0))

if len(left) > 0:

result.extend(left[:])

if len(right) > 0:

result.extend(right[:])

return result

def merge_sort(arr):

if len(arr) < 2:

return arr

middle = len(arr) // 2

return merge(merge_sort(arr[:middle]), merge_sort(arr[middle:]))

快速排序

取一个元素,将比它小的元素都移到它左侧,将比它大的元素都移到它右侧,并递归地处理它左侧的序列和右侧的序列。

def partition(arr, left=None, right=None):

pivot = left

index = pivot + 1

for i in range(index, right + 1):

if arr[i] < arr[pivot]:

arr[i], arr[index] = arr[index], arr[i]

index += 1

arr[pivot], arr[index - 1] = arr[index - 1], arr[pivot]

return index - 1

def quick_sort(arr, left=None, right=None):

left = 0 if left is None else left

right = len(arr) - 1 if right is None else right

if left < right:

partition_index = partition(arr, left, right)

quick_sort(arr, left, partition_index - 1)

quick_sort(arr, partition_index + 1, right)

return arr

堆排序

首先构建一个最大堆,最大堆的性质是父节点的值总是大于其左右子节点的值,那么此时根节点的值是最大的,则将其移到序列的最右边。之后将堆中当前最后一个叶节点移到根节点上,因为这可能会不符合最大堆的性质,所以会进行调整,将它与其左右子节点中最大的值进行交换,则相当于将叶节点向下移动,交换过后如果还是不符合性质,则继续进行交换,直到符合性质后,此时的根节点的值就是当前堆中的最大值,将其取出放入序列中正确的位置后继续上述流程处理剩下的节点。

global length2

def heapify(arr, i):

left = 2 * i + 1

right = 2 * i + 2

largest = i

if left < length2 and arr[left] > arr[largest]:

largest = left

if right < length2 and arr[right] > arr[largest]:

largest = right

if largest != i:

arr[i], arr[largest] = arr[largest], arr[i]

heapify(arr, largest)

def build_max_heap(arr):

for i in range(len(arr) // 2, -1, -1):

heapify(arr, i)

def heap_sort(arr):

global length2

length2 = len(arr)

build_max_heap(arr)

for i in range(len(arr) - 1, 0, -1):

arr[0], arr[i] = arr[i], arr[0]

length2 -= 1

heapify(arr, 0)

return arr

计数排序

将序列中的元素按照其值放入相应的桶中,之后再按照桶的顺序取出即可,计数排序不需要比较操作。

def counting_sort(arr):

max_value = max(arr)

buckets = [0] * (max_value + 1)

index = 0

length = len(arr)

for i in range(length):

buckets[arr[i]] += 1

for j in range(max_value + 1):

while buckets[j] > 0:

arr[index] = j

index += 1

buckets[j] -= 1

return arr

桶排序

类别计数排序,构造很多桶,但每个桶中能放入值在特定范围内的元素,将序列中的元素按照要求放入各个桶中,再将每个桶中的元素进行排序,最后按照桶的顺序和各个桶中元素的顺序得到最终序列。

def bucket_sort(arr):

bucket_size = 5

max_value = max(arr)

min_value = min(arr)

bucket_num = (max_value - min_value) // bucket_size + 1

buckets = {i: [] for i in range(bucket_num)}

for i in range(len(arr)):

buckets[(arr[i] - min_value) // bucket_size].append(arr[i])

result = []

for i in range(bucket_num):

insertion_sort(buckets[i])

result.extend(buckets[i])

return result

基数排序

按照元素值的特定位进行排序,从低位到高位分别进行排序。

def radix_sort(arr):

max_value = max(arr)

max_digit = len(str(max_value))

dev = 1

mod = 10

result = arr[:]

for i in range(max_digit):

buckets = {i: [] for i in range(mod)}

for k in range(len(result)):

key = (result[k] % mod) // dev

buckets[key].append(result[k])

result = []

for j in range(mod):

result.extend(buckets[j])

dev *= 10

mod *= 10

return result

上述代码放在 这里

参考

到此这篇关于python实现经典排序算法的示例代码的文章就介绍到这了,更多相关python 经典排序算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何减小内存碎片

内存碎片 &#xff1a; 内部碎片&#xff08;占了不用&#xff09; 内部碎片就是已经被分配出去&#xff08;能明确指出属于哪个进程&#xff09;却不能被利用的内存空间&#xff1b;内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而…

python 英语翻译 excel_python批量将excel内容进行翻译写入功能

由于小编初来乍到&#xff0c;有很多地方不是很到位&#xff0c;还请见谅&#xff0c;但是很实用的哦&#xff01;1.首先是需要进行文件的读写操作&#xff0c;需要获取文件路径&#xff0c;方式使用os.listdir(路径)进行批量查找文件。file_path ‘/home/xx/xx/xx# ret 返回一…

bison实例

逆波兰记号计算器【文件名rpcalc.y】%{ #define YYSTYPE double #include <stdio.h> #include <math.h> #include <ctype.h> int yylex (void); void yyerror (char const *); %}%token NUM%% input: /* empty */| input line;line: \n| exp \n …

InstallShield LaunchAppAndWait运行另一个程序并等待该程序终止。

LaunchAppAndWait语法&#xff1a;LaunchAppAndWait (szProgram, szCmdLine, lWait);说明&#xff1a;LaunchAppAndWait函数运行由szProgram指定的带有szCmdLine指定的命令行参数的应用程序。第三个参数&#xff0c;lWait指示安装在继续前是否要等待直到运行的应用程序终止。 …

python3 while循环语句_python While 循环语句

python While 循环语句发布时间&#xff1a;2018-02-12 16:46:28编辑&#xff1a;admin阅读(2055)python 编程中 while 语句用于循环执行程序&#xff0c;即在某条件下&#xff0c;循环执行某段程序&#xff0c;以处理需要重复处理的相同任务。其基本形式为&#xff1a;while 判…

笔记:Zygote和SystemServer进程启动过程

简述 Android设备启动过程中&#xff0c;先是Linux内核加载完&#xff0c;接着Android中的第一个进程init启动&#xff0c;它会启动一些需要开机启动的进程。 Zygote就是进程init启动起来的。Android中所有应用程序进程&#xff0c;以及运行系统关键服务的System进程都是由Zygo…

C中执行指令/程序

//执行并等待程序运行完毕system("E:\\code\\Test\\Debug\\MyEditor.exe"); //暂停system("pause");

python中怎么精确20位_Python中的精确处理

Python可以使用不同的函数来处理浮点数的精度。数学模块中定义了大多数用于精确处理的函数。因此&#xff0c;要使用它们&#xff0c;首先我们必须将math模块导入到当前命名空间中。import math现在&#xff0c;我们将看到一些用于精确处理的功能。该trunc()方法该trunc()方法用…

Axure 共享强制签出签入

签出时点击不签出编辑全部——确定修改后签入时点击全部偷偷签出——确定注意一定要修改后&#xff0c;否则无法检测到修改&#xff0c;不会执行签入

ubuntu mysql混合开发_mysql5.7主从同步 ubuntu

实现环境&#xff1a;| System   | mysql     | ip       ||主ubuntu  | mysql-5.7.24 | 10.192.209.122 ||从ubuntu  | mysql-5.7.39 | 10.192.209.43 |注&#xff1a;从服务器的mysql版本最好和主服务器相同&#xff0c;或者大于主服务器版本MySQL主…

关于逐项作用函数的用法

关于逐项作用函数的用法讲一下Thread这个函数的用法&#xff0c;其中后面两个用法很好用&#xff0c;也常常被忽略。用法一&#xff1a;比较常用用法二&#xff1a;我觉得这一种是很实用的有拓展的方法用法三&#xff1a;构造一种映射关系&#xff0c;在配合 Association[] 关联…

IIS Service Unavailable问题

应用程序池被两个.Net版本的网站使用&#xff0c;不同.Net版本的网站应该用不同的应用程序池&#xff0c;服务器上最好是每个网站一个应用程序池&#xff0c;避免某个网站导致应用程序池停止运行而影响其他网站。

博客园的博客终于开通了

楼主来了博客园不知不觉已经1年5个月&#xff0c;实际上早就知道博客园的存在&#xff0c;一直没注册。 在园子里&#xff0c;感觉时间过得好快&#xff0c;期间学习到了很多东西&#xff0c;唯一不足的是没有及时记下心得和笔记。 现在有些知识点又忘得差不多&#xff0c;好记…

linux搭建java开发环境_linux中搭建java开发环境

今天试着在Linux下面搭建java开发环境&#xff0c;现总结一下具体步骤。1、JDK的安装1.6 版本cd /optmkdir java执行下面命令安装JDK(首先创建/opt/java目录)tar -xvf jdk-7u7-linux-i586.tar.gz -C /opt/javaln -s /opt/java/jdk1.7.0_09 /opt/java/jdk 创建一个链接vi /etc/f…