Quick Sort是如何工作的?
第一步:划分数列
- 我们需要把给出的数列划分成如下排序(以某个数为基准,将小于等于这个数的数全部放在左侧,将大于这个数的数全部放在右侧)。
第二步:针对每次划分后的“左侧数组”和“右侧数组”,我们再次进行步骤1中的操作,直到数组中只有一个数字
如何将数列划分成步骤1中的样子?
- 首先我们可以先假设数列中的第一个数是那个中间数(当然你也可以假设最后一个数为中间数或任何一个位置的数都可以),然后用剩余的数依次与它进行比较。注:中间数我们常用pivot代指。图中绿色区域表示小于中间数的数,红色部分表示大于中间数的数。
- 如果w的值小于a,那么我们需要把w加到绿色区域的尾巴上。即调换w和红色区域第一个数的位置。
- 如果w的值大于于a,那么我们不需要调换位置,直接把w加在红色区域尾巴上即可。
- 然后我们再把下一个位置上的w和a进行比较,重复上面的操作。
- 当所有数字的比较完成后我们会得到下图中第一行的数列。那么为了把a放到两个阵营的中间,我们只需要把a和绿色区域数字中的最后一个进行对调,对调后我们就获得了我们的目标数列,同时我们也知道a的索引位置。
Quick Sort的代码实现
代码逻辑说明:
# in python3
# 假设第一个数为中间数来进行比较
def quick_sort(arr,low,high):
if low >= high:
return
pi = partition(arr, low, high)
quick_sort(arr, low, pi-1)
quick_sort(arr, pi+1, high)
def partition(arr, low, high):
pivot = arr[low]
j = low
for i in range(low+1,high+1):
# if current element is smaller
if arr[i] <= pivot:
j += 1
arr[j],arr[i] = arr[i],arr[j]
arr[low],arr[j] = arr[j],arr[low]
return j
list = [7, 5, 3, 8, 4, 9]
n = len(list)
quick_sort(list,0,n-1)
print (list)
# in python
# 假设最后一个数为中间数来进行比较
def quick_sort(arr,low,high):
if low >= high:
return
pi = partition(arr, low, high)
quick_sort(arr, low, pi-1)
quick_sort(arr, pi+1, high)
def partition(arr,low,high):
j = ( low-1 )
pivot = arr[high] # pivot element
for i in range(low , high):
# If current element is smaller
if arr[i] <= pivot:
# increment
j = j+1
arr[j],arr[i] = arr[i],arr[j]
arr[j+1],arr[high] = arr[high],arr[j+1]
return ( j+1 )
list = [7, 5, 3, 8, 4, 9]
n = len(list)
quick_sort(list,0,n-1)
print (list)
补充举例:
将pivot的位置同j进行对调是因为我们需要把pivot放在两个阵营的中间,而j是所有小于pivot的数的最后一位,因此将pivot的位置和j对调后其最新的位置就是在两个阵营中间了。
重复排序操作,直到新数列(需要排序的数列)中只剩下一位数字。
Quick Sort的运行速度
运行速度取决于做比较的次数
Worst case runing time is
Ideal case running time is