本文用Python实现了 快速排序、插入排序、希尔排序、归并排序、堆排序、选择排序、冒泡排序 共7种排序算法。
公众号:PythonEco
1.介绍
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
2.步骤及流程图
(1)从数列中挑出一个元素,称“基准”
(2)重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
(3)递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
3.python实现
#encoding=utf-8import random #快速排序 def qsort(list,low,high): if low >= high: return first=low last=high key=list[first] #主循环,算法重点,见流程图 while last>first: while last>first and list[last] >= key: last-=1 list[first]=list[last] while last>first and list[first] <= key: first+=1 list[last]=list[first] list[first]=key #这两行利用递归完成两个分区的排序 qsort(list,low,first-1) qsort(list,first+1,high) #以下是调用快速排序方法my_list=[] for i in range(8): my_list.append(random.randint(1,300)) qsort(my_list,0,len(my_list)-1) print(my_list)
4.视觉效果展示
1.介绍
插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
2.步骤
(1)从第一个元素开始,该元素可以认为已经被排序
(2)取出下一个元素,在已经排序的元素序列中从后向前扫描
(3)如果该元素(已排序)大于新元素,将该元素移到下一位置
(4)重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
(5)将新元素插入到该位置中
(6)重复步骤2
3.python实现
#encoding=utf-8import random # 插入排序 def insert_sort(lists): count = len(lists) for i in range(1, count):#取下一个元素到key key = lists[i] j = i - 1 while j >= 0:#找到新元素(key)的正确位置 if lists[j] > key: lists[j + 1] = lists[j] lists[j] = key j -= 1 return lists#调用插入排序方法 my_list=[] for i in range(8): my_list.append(random.randint(1,300)) insert_sort(my_list) print(my_list)
1.介绍
希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
2.python实现 (小詹写的运行过程出了点错,先借用下别人的小程序哈)
#encoding=utf-8# 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。# 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。# 希尔排序是基于插入排序的以下两点性质而提出改进方法的:# 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率# 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位def ShellInsetSort(array, len_array, dk): # 直接插入排序 for i in range(dk, len_array): # 从下标为dk的数进行插入排序 position = i current_val = array[position] # 要插入的数 index = i j = int(index / dk) # index与dk的商 index = index - j * dk # while True: # 找到第一个的下标,在增量为dk中,第一个的下标index必然 0<=index # index = index - dk # if 0<=index and index # break # position>index,要插入的数的下标必须得大于第一个下标 while position > index and current_val < array[position-dk]: array[position] = array[position-dk] # 往后移动 position = position-dk else: array[position] = current_valdef ShellSort(array, len_array): # 希尔排序 dk = int(len_array/2) # 增量 while(dk >= 1): ShellInsetSort(array, len_array, dk) print(">>:",array) dk = int(dk/2)if __name__ == "__main__": array = [49, 38, 65, 97, 76, 13, 27, 49, 55, 4] print(">:", array) ShellSort(array, len(array))
这里改过来了自己的也附加到下边,原因在于Python3.0, " / "就一定表示 浮点数除法,返回浮点结果;" // "表示整数除法。
#encoding=utf-8def shell_sort(lists): # 希尔排序 count = len(lists) step = 2 group = count // step while group > 0: for i in range(0, group): j = i + group while j < count: k = j - group key = lists[j] while k >= 0: if lists[k] > key: lists[k + group] = lists[k] lists[k] = key k -= group j += group group //= step return listsarray = [49, 38, 65, 97, 76, 13, 27, 49]list1 = shell_sort(array)print(list1)
3.视觉效果展示
公众号:PythonEco
1.介绍
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
2.步骤
(1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
(2)设定两个指针,最初位置分别为两个已经排序序列的起始位置
(3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
(4)重复步骤3直到某一指针达到序列尾
(5)将另一序列剩下的所有元素直接复制到合并序列尾
3.python实现
#encoding=utf-8def merge(left, right): i, j = 0, 0 result = [] while i < len(left) and j < len(right): if left[i] <= right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result += left[i:] result += right[j:] return resultdef merge_sort(lists): # 归并排序 if len(lists) <= 1: return lists num = len(lists) // 2 #python3 //区别/ left = merge_sort(lists[:num]) right = merge_sort(lists[num:]) return merge(left, right)array = [49, 38, 65, 97, 76, 13, 27, 49]list1 = merge_sort(array)print(list1)
4.视觉效果展示
1.介绍
堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
2.步骤(略)
3.python实现
#encoding=utf-8#沿左,右子节点较大者依次往下调整def heapify( array, i, n ): j = i * 2 + 1 while j < n: if j + 1 < n and array[j] < array[j + 1]: j += 1 if array[i] > array[j]: break array[i], array[j] = array[j], array[i] i = j j = i * 2 + 1#创建堆def build_heap( array ): size = len( array ) for i in range( size // 2 - 1, -1, -1 ): heapify( array, i, size )#大顶堆排序def heap_sort( array ): size = len( array ) build_heap( array ) #交换堆顶与最后一个结点,再调整堆 for i in range( size - 1, 0, -1 ): array[0], array[i] = array[i], array[0] heapify( array, 0, i )a = [ -3, 1, 3, 0, 9, 7 ]heap_sort( a )print( a )
4.视觉效果展示
1.介绍
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。
2.步骤(略)
3.python实现
#encoding=utf-8def select_sort(lists): # 选择排序 count = len(lists) for i in range(0, count): min = i for j in range(i + 1, count): if lists[min] > lists[j]: min = j lists[min], lists[i] = lists[i], lists[min] return listsa = [ -3, 1, 3, 0, 9, 7 ]select_sort( a )print( a )
4.视觉效果展示
1.介绍
冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
2.步骤
(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
3.python实现
#encoding=utf-8def bubble_sort(lists): # 冒泡排序 count = len(lists) for i in range(0, count): for j in range(i + 1, count): if lists[i] > lists[j]: lists[i], lists[j] = lists[j], lists[i] return listsa = [ -3, 1, 3, 0, 9, 7 ]bubble_sort( a )print( a )
4.视觉效果展示
到此几种排序算法就介绍完了,如果有想学习python的程序员,可来我的python学习扣qun:711944363,免费送python的视频教程噢!我每晚上8点还会在群内直播讲解python知识,欢迎大家前来学习交流。