快速排序(Quicksort)是对冒泡排序的一种改进。
快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
排序算法,即将一串杂乱无章的数字按照从小到大或者从大到小的顺序重新排列一遍,众所周知,目前排序算法很多,常见的有冒泡排序,选择排序,插入排序,也有堆排序,希尔排序,归并排序等,这里介绍快速排序,下面列出各种常用排序算法的时间复杂度,空间复杂度等
下面我将用python来实现这个算法,特意没有用python现成的模块方法,C语言初学者应该也能看得懂
思路讲解:
快速排序虽然很快,但也是同冒泡排序,选择排序算法一样,需要多轮,不是扫描一遍就能排好的
这里介绍排序后结果为从小到大排列。首先选择一个基准值base,以这个值为标准,把一串数字分为两堆,左边比base小,右边均比base大
如上所示,这是初始数组,base值可以任意选,这里我就选择第一个值了,base等于30,第一轮目的是:把这一串数字分为两堆,左边比30小,右边均比30大
主要思想是,一串数字串的两头定义两个指针(数组就可以用下标表示),然后两头指针开始分别移动,但移动的规则是什么呢?由于我这里选择的base值是左边第一个值,那么我就应该从右边先开始。
①右边指针指向的值与base值比较,若比base值大,那么右指针向左边移动一格(如果是下标,就是下标值减一,对吧?),一直重复这个操作,直到找到一个右指针指向的值比base小的时候,右指针指向的值直接赋给左指针指向的值(此时左右指针指向的值是一样的,不过指向的位置不一样),然后右指针暂停
②轮到左指针了,左边指针指向的值与base值比较,若比base值小,那么左指针向右边移动一格(如果是下标,就是下标值加一),一直重复这个操作,直到找到一个左指针指向的值比base大的时候,左指针指向的值直接赋给右指针指向的值(此时左右指针指向的值是一样的,不过指向的位置不一样),然后左指针暂停
然后又轮到右指针了,如此循环往复①②操作
那么什么时候停止呢?
左右指针一直在相向而行,等到左右指针重合时,将base值赋给左右指针指向的值(此时左右指针重合),至此,第一轮结束。
上面的例子数字串,经过第一轮排序后,应该是怎样的了呢?
上面也说了,你也看到了,快速排序算法一轮解决不了问题,这只是分了两堆分别排序而已,那么问题来了,接下来怎么做呢?我们发现,以上一个base值分界,可以分为两个堆,这两个堆是宏观上从小到大的对吧?以30为界,左边小于右边,思路就来了,这两个堆分别再来进行上面说的算法思路,这其实是一个听起来很高大上的算法:分治算法,就分别治理而已
下一轮,结果是怎样的?
此时,宏观上就是四堆了,四堆有序(虽然这题其实是三堆)
用到递归来实现
下面是具体实现过程
递归函数:
#Quicksort algorithm
def Quicksort(array,_left,_right):
left = _left
right = _right
if(left<=right):#待排序的元素至少有两个的情况,数组只有一个的话排序无意义
base = array[left] # 选定的一个基准值(数组中的任意值,这里就选择数组第一个元素了)
while(left=base and right>left):#从数组最右边开始找,直到找到一个比base值小的值终止循环
right -= 1 # right指针左移
array[left] = array[right] # 将右值赋给左值,right指针不动
while (array[left] < base and right>left): # 从数组最左边开始找,直到找到一个比base值大的值终止循环
left += 1 # left指向数组的下一个元素,即left指针右移
array[right] = array[left] # 将左值赋给右值,right指针不动
array[left] = base#将基准值放在left与right指针重合的位置,至此此轮排序扫描结束
#下面是分治算法,分细堆,递归实现,_left,_right的作用是记录上次的起始位置,便于递归分治
Quicksort(array,_left,left-1)#左堆
Quicksort(array,right+1,_right)#右堆
调用过程:
sort_array = [30,20,50,73,85,29,54,32,47,87,100,13,43]#初始举例数组
size = len(sort_array)#数组大小
left = 0#初始左指针(其实这里指坐标)
right = size-1#初始右指针
print(sort_array)#打印初始数组
Quicksort(sort_array,left,right)#调用快速排序算法函数
print(sort_array)#打印排序后的结果数组
结果: