4. 把基准数和最终相遇的数交换,结束。此步骤定位了一个数。
5. 原基准数左边和右边的序列再分别重复1-4的步骤。继续定位新的基准数。直到全部数字定位结束。
def quicksort(a,left,right)
if left > right # 设定何时停止该方法的调用。
return
end
temp = a[left] #设定最左边的为基准数
i = left
j= right
while i != j # i和j从两边向中间靠拢,直到i和j重合,结束本轮循环。
# 根据是升序还是降序来选择 比较运算符号。
while a[j] <= temp && i < j #根据基准点是a[left],要先从右往左找。
j -= 1
end
while a[i] >= temp && i < j #再从左向右找,这里找小于基准数的数。
i += 1
end
if i < j #当i 和 j 没有相遇的时候,交换数据
t = a[i]
a[i] = a[j]
a[j] = t
end
end
a[left] = a[i] #将基准数归位。
a[i] = temp
print a.to_s + "\n" #打印每次交换的结果
quicksort(a,left,i-1) # 在quciksort的方法中,再次调用本方法,形成递归的过程。这个是处理i左边。 # 直到穷尽,即当left>right时停止调用该方法。
quicksort(a,i+1,right) # 这个处理i右边
end
a = [7, 68, 42, 46, 9, 91, 77, 46, 86, 1]
quicksort(a,0,9)
# 0和9 代表数组最左边和最右边的key
print a
结果:
[86, 68, 42, 46, 9, 91, 77, 46, 7, 1]
[91, 86, 42, 46, 9, 68, 77, 46, 7, 1]
[91, 86, 42, 46, 9, 68, 77, 46, 7, 1]
[91, 86, 77, 46, 46, 68, 42, 9, 7, 1]
[91, 86, 77, 46, 46, 68, 42, 9, 7, 1]
[91, 86, 77, 68, 46, 46, 42, 9, 7, 1]
[91, 86, 77, 68, 46, 46, 42, 9, 7, 1]
[91, 86, 77, 68, 46, 46, 42, 9, 7, 1]
[91, 86, 77, 68, 46, 46, 42, 9, 7, 1]
[91, 86, 77, 68, 46, 46, 42, 9, 7, 1]
[91, 86, 77, 68, 46, 46, 42, 9, 7, 1] #最终结果