python数据结构与算法(15)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python数据结构与算法(15)相关的知识,希望对你有一定的参考价值。
选择排序
选择排序(Selection sort)是?种简单直观的排序算法。它的?作原理如 下。?先在未排序序列中找到最?(?)元素,存放到排序序列的起始位 置,然后,再从剩余未排序元素中继续寻找最?(?)元素,然后放到已排 序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置 上,则它不会被移动。选择排序每次交换?对元素,它们当中?少有?个将 被移到其最终位置上,因此对n个元素的表进?排序总共进??多n-1次交 换。在所有的完全依靠交换去移动元素的排序?法中,选择排序属于?常好 的?种。
选择排序分析
排序过程:
红?表示当前最?值,??表示已排序序列,蓝?表示当前
位置。
def selection_sort(alist): n = len(alist) # 需要进?n-1次选择操作 for i in range(n-1): # 记录最?位置 min_index = i # 从i+1位置到末尾选择出最?数据 for j in range(i+1, n): if alist[j] < alist[min_index]: min_index = j # 如果选择出的数据不在正确位置,进?交换 if min_index != i: alist[i], alist[min_index] = alist[min_index], al ist[i]
alist = [54,226,93,17,77,31,44,55,20]
selection_sort(alist) print(alist)
时间复杂度
最优时间复杂度:O(n ) 最坏时间复杂度:O(n ) 稳定性:不稳定(考虑升序每次选择最?的情况)
选择排序演示
插?排序
插?排序(英语:Insertion Sort)是?种简单直观的排序算法。它的?作原 理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描, 找到相应位置并插?。插?排序在实现上,在从后向前扫描过程中,需要反 复把已排序元素逐步向后挪位,为最新元素提供插?空间。
插?排序分析
def insert_sort(alist): # 从第?个位置,即下标为1的元素开始向前插? for i in range(1, len(alist)): # 从第i个元素开始向前?较,如果?于前?个元素,交换位置 for j in range(i, 0, -1): if alist[j] < alist[j-1]:
alist[j], alist[j-1] = alist[j-1], alist[j]
alist = [54,26,93,17,77,31,44,55,20] insert_sort(alist) print(alist)
时间复杂度
最优时间复杂度:O(n) (升序排列,序列已经处于升序状态) 最坏时间复杂度:O(n ) 稳定性:稳定
插?排序演示
快速排序
快速排序(英语:Quicksort),?称划分交换排序(partition-exchange sort),通过?趟排序将要排序的数据分割成独?的两部分,其中?部分的 所有数据都?另外?部分的所有数据都要?,然后再按此?法对这两部分数 据分别进?快速排序,整个排序过程可以递归进?,以此达到整个数据变成 有序序列。
步骤为:
- 从数列中挑出?个元素,称为"基准"(pivot), 2. 重新排序数列,所有元素?基准值?的摆放在基准前?,所有元素?基 准值?的摆在基准的后?(相同的数可以到任?边)。在这个分区结束 之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3. 递归地(recursive)把?于基准值元素的?数列和?于基准值元素的? 数列排序。
递归的最底部情形,是数列的??是零或?,也就是永远都已经被排序好 了。虽然?直递归下去,但是这个算法总会结束,因为在每次的迭代 (iteration)中,它?少会把?个元素摆到它最后的位置去。
快速排序的分析
def quick_sort(alist, start, end): """快速排序""" # 递归的退出条件 if start >= end: return # 设定起始元素为要寻找位置的基准元素 mid = alist[start] # low为序列左边的由左向右移动的游标 low = start # high为序列右边的由右向左移动的游标 high = end while low < high: # 如果low与high未重合,high指向的元素不?基准元素?,则high向 左移动 while low < high and alist[high] >= mid: high -= 1 # 将high指向的元素放到low的位置上 alist[low] = alist[high] # 如果low与high未重合,low指向的元素?基准元素?,则low向右移动 while low < high and alist[low] < mid: low += 1 # 将low指向的元素放到high的位置上 alist[high] = alist[low] # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置 # 将基准元素放到该位置 alist[low] = mid # 对基准元素左边的?序列进?快速排序 quick_sort(alist, start, low-1) # 对基准元素右边的?序列进?快速排序 quick_sort(alist, low+1, end) alist = [54,26,93,17,77,31,44,55,20] quick_sort(alist,0,len(alist)-1) print(alist)
以上是关于python数据结构与算法(15)的主要内容,如果未能解决你的问题,请参考以下文章