快排的逻辑
首先在这组数据中随意选择一个数字作为基准;
然后比该基准小的数字在基准数字的左边,比该基准大的数字在基准数字的右边
- 第一趟排序过后,把数据分为了两部分一部分是比基准大的数据,一部分是比基准小的数据,然后在分出来的每部分按上述步骤再排,一直排到分组中的数据只有一个或者没有数据为止
Python实现示例
# coding:utf-8
__author__ = 'tommyxie'
def kuaipai(arr, i, j):
if i < j:
# 调用快排函数,根据基准数据,将数据分为两部分
base = kuaipaiprocess(arr, i, j)
# 针对基准左侧的数据,进行递归调用快排函数,再次进行排序
kuaipai(arr, i, base)
# 针对基准右侧的数据,进行递归调用快排函数,再次进行排序
kuaipai(arr, base + 1, j)
def kuaipaiprocess(arr, i, j):
# 先选中基准数据
basedata = arr[i]
while i < j:
# 当数据大于基准数据时,没有交叉变化,j指针往前移动即可
while i < j and arr[j] >= basedata:
j -= 1
# 当数据小于基准数据时,会发生交叉变化,活动指针将j变换为了i
while i < j and arr[j] < basedata:
# 将j所指向的值,移动到i的位置
arr[i] = arr[j]
# 活动指针往后移动
i += 1
# 将i指针所指向的值移动到j的位置,保证j一直为活动指针,然后继续进行比较
arr[j] = arr[i]
# 将基准数据移动到i指针所在的位置
arr[i] = basedata
# 返回下一次基准数据所在的位置
return i
if __name__ == '__main__':
testdata = [1, 34, 6, 2, 5, 5, 88]
kuaipai(testdata, 0, len(testdata) - 1)
print(testdata)
测试结果