本文主要介绍八种常用排序算法的基本概念及其Python实现方法。如果你是Java程序员,也可以看看我们之前介绍的八位Java程序员。排序算法。1、插入排序说明插入排序的基本操作是将一条数据插入到已经排序好的有序数据中,从而得到一个编号加一的新的有序数据。该算法适用于对少量数据进行排序,时间复杂度为O(n^2)。是一种稳定的排序方法。插入算法将待排序数组分为两部分:第一部分包含数组的所有元素,除了最后一个元素(让数组多出一个空间插入),而第二部分只包含这一个元素(即要插入的元素)。第一部分排序后,将第一个元素插入已排序的第一部分。代码实现definesert_sort(lists):#insertsortcount=len(lists)foriinrange(1,count):key=lists[i]j=i-1whilej>=0:iflists[j]>key:lists[j+1]=lists[j]lists[j]=keyj-=1returnlists2.Shell排序说明Shell排序(ShellSort)是一种插入排序。也称为收缩增量排序,它是直接插入排序算法的更高效和改进版本。希尔排序是一种不稳定的排序算法。这种方法是由于DL。Shell因1959年提出而得名。希尔排序是将记录按一定的下标增量进行分组,并使用直接插入排序算法对每一组进行排序;随着增量逐渐减小,每组包含的关键词越来越多。当增量减为1时,整个文件刚刚分组完毕,算法结束。代码实现defshell_sort(lists):#hill排序count=len(lists)step=2group=count/stepwhilegroup>0:foriinrange(0,group):j=i+groupwhilej=0:iflists[k]>key:lists[k+group]=lists[k]lists[k]=keyk-=groupj+=groupgroup/=stepreturnlists3.冒泡排序说明已经多次访问了A排序一次比较两个元素并在顺序错误时交换它们的数组。重复访问序列的工作,直到不需要交换,即序列已经排序。代码实现defbubble_sort(lists):#bubblesortcount=len(lists)foriinrange(0,count):forjinrange(i+1,count):iflists[i]>lists[j]:lists[i],lists[j]=列表[j],列表[i]返回列表4。快速排序描述是通过一次排序将待排序的数据分成独立的两部分,其中一部分的所有数据都小于另一部分的所有数据,然后根据这种方法,分别对两部分数据进行快速排序sorted,整个排序过程可以递归进行,这样整个数据就变成了一个有序的序列。代码实现defquick_sort(lists,left,right):#quicksortifleft>=right:returnlistskey=lists[left]low=lefthigh=rightwhileleft=key:right-=1lists[left]=lists[right]whileleftlists[j]:min=jlists[min],lists[i]=lists[i],lists[min]returnlists6.堆排序描述堆排序(Heapsort)是指利用堆叠树(堆)的数据结构设计的一种排序算法。它是一种排序算法。可以利用数组的特性快速定位到指定索引处的元素。堆分为大根堆和小根堆,是一棵完全二叉树。大根堆的要求是每个节点的值不大于其父节点的值,即A[PARENT[i]]>=A[i]。在数组的非降序排序中,需要用到大根堆,因为根据大根堆的要求,***的值必须在堆顶。代码实现#调整堆defadjust_heap(lists,i,size):lchild=2*i+1rchild=2*i+2max=iifilists[max]:max=lchildifrchildlists[max]:max=rchildifmax!=i:lists[max],lists[i]=lists[i],lists[max]adjust_heap(lists,max,size)#createheapdefbuild_heap(lists,size):foriinrange(0,(size/2))[::-1]:adjust_heap(lists,i,size)#堆排序defheap_sort(lists):size=len(lists)build_heap(lists,size)foriinrange(0,size)[::-1]:lists[0],lists[i]=lists[i],lists[0]adjust_heap(lists,0,i)7.归并排序说明归并排序是基于merge运算中的一种高效排序算法,是分治法(DivideandConquer)非常典型的应用。将有序的子序列组合起来,得到一个完全有序的序列;即先把每个子序列排好序,再把子序列段排好序。如果将两个排序列表合并为一个排序列表,则称为双向合并。合并过程为:比较a[i]和a[j]的大小,如果a[i]≤a[j],将第一个有序列表中的元素a[i]复制到r[k]中,并添加1分别为i和k;否则,将第二个有序列表中的元素a[j]复制到r[k]中,对j和k分别加1,以此类推,直到取出其中一个有序列表,再取出另一个中的剩余元素有序列表被复制到r中从下标k到下标t的单元。我们通常使用递归来实现归并排序的算法。先把待排序的区间[s,t]按中点一分为二,然后对左边的子区间进行排序,再对右边的子区间进行排序。***使用左右区间一次合并操作合并成有序区间[s,t]。代码实现defmerge(left,right):i,j=0,0result=[]whilei