快速排序
快速排序介绍
快速排序(Quick Sort)是通过分治的思想来进行排序。它的主要思想是:取数组中的一个数作为基准值(往往取数组中的第一个数),把所有小于基准值的数都放在它的左侧,再把所有大于基准值的数都放在它的右侧。随后,对基准值左右两侧的数组分别进行快速排序。
快速排序的平均时间复杂度是O(),最好情况下的时间复杂度是O(
)。最坏情况下,快速排序的时间复杂度可能退化为O(
),但这种情况很少见。快速排序是一个不稳定的算法,如果使用得当,快速排序的速度可以达到归并排序和堆排序的数倍,所以快速排序是一种极其常用的算法。
动图演示
这动图看的可能不是那么直观,我建议可以看这片文章的解释,能够更好理解排序的过程(快速排序详细讲解)
python代码
第一种实现方法:
1、取需要排序列表的第一个元素数值当做基准
2、创建3个空列表分别存放,比基准小的集合,与基准相等的集合,比基准大的集合,遍历除基准外所有元素数值与基准对比,将各个元素数值添加到对应列表中
3、接着对比基准小的集合列表,比基准大的集合重复进行上述操作,直到列表只剩一个元素或者为空后停止
4、将排序后的列表进行拼接
def QuickSort(num): #若数组长度为0,1,直接返回不用排序 if len(num)<=1: return num #取数组第一个数值作为基准 key = num[0] #定义空列表用来存储大于/小于/等于基准值的元素 llist,mlist,rlist = [],[],[] #按key对每个元素进行比较,并存放如对应列表中 for i in range(0,len(num)): if num[i] <key: llist.append(num[i]) elif num[i] == key: mlist.append(num[i]) elif num[i] >key: rlist.append(num[i]) #递归,对左右两个列表再进行快排,拼接三个列表后返回 return QuickSort(llist)+mlist+QuickSort(rlist) nums = [5 ,1 ,2 ,6 ,9 ,3 ,4 ,7 ,10 ,8] r = QuickSort(nums) print(r)
以这种方法来实现快速排序需要额外的开辟空间给用于归类的列表。并且相似的思路用于其他的编程语言是效率低
第二种实现方法:
1、使用key来存放基准值(列表的第一个值),然后定义2个变量l,r来表示左右指针的位置
2、先移动右指针,找到一个比基准小的值,将这个值赋值给当前左指针指向的位置(还未移动,那么就是最左边)
3、开始移动左指针,找到一个比基准大的值,将这个值赋值给当前右指针所指向的位置
4、循环反复直到左右指针指向同一个位置,将key值重新赋值到这个共同指向的位置,以这个位置为界限,比基准大的值都在右边,比基准小的值都在左边
5、现在左右两边也按照此步骤接着进行上述排序即可
def QuickSort(num,left,right): #如果左边界大于有边界直接退出 if left>=right: return #l,r定义左右指针的位置,key为基准数值(默认列表开始的第一个元素为基准) l,r,key = left,right,num[left] #移动左右指针,与基准比较,小的放左区间,大的放右区间 while l<r: #先从右指针开始向左移动,直到找到比基准小的数值,然后覆盖到左指针所指向的数值 while l<r and num[r] >=key: r -=1 #找到后覆盖到左指针指向的位置 num[l] = num[r] #左指针开始向右移动,直到找到比基准大的数值,然后覆盖到右指针所指向的数值 while l<r and num[l] <key: l +=1 #找到后覆盖到右指针指向的位置 num[r] = num[l] #现在所有比基准小的数值都在左边(称为左区间),比基准大的数值都在右边(称为右区间),且左右指针都指向中间位置 #将基准key放到列表最中间(即左右指针现在指向的位置) num[l] = key #然后对现在的左右区间,进行相同的操作,直到排序结束 QuickSort(num,left,l-1) QuickSort(num,l+1,right) return num nums = [5 ,1 ,2 ,6 ,9 ,3 ,4 ,7 ,10 ,8] r = QuickSort(nums,0,len(nums)-1) print(r)