Python 快速排序
def quick_sort(array, start, end):
"""
:param array: 待排序列表
:param start: 开始的位置
:param end: 结束的位置
:return:
1、快速排序主要是对列表的分区也叫分治 从列表中挑选一个元素 作为标志 一般为第一个值为准
2、指定左指针 列表开始的位置 也就是下标为0的位置
3、指定右指针 列表结束的位置 也就是洗标为-1的位置
4、1、选取下标为0的元素,就先移动右指针,存在以下两种情况
1、找到小于选取得值为准 将小于选取值的元素放到左指针的位置,由于选取值的下标与左指针位置相同直接赋值就可以。之后就可以移动左指针了
2、右移指针等于了左移指针 代表移动到了最左端说明该值是最大的,此时的右指针等于左指针,那么就不需要 不要左移指针判断 分区结束
5、1、移动左指针,同样存在两种情况
1、找到大于选取值的值为准,将大于选取值的元素放到上次右移指针结束的位置 因为上次右移指针上的值已经交换到左指针的位置 ,之后再移动右移指针
2、左移指针等于右指针,代表左移指针移动到了最右端和右移指针重合,说明选取值在该列表中是最小值 此时左指针等于有指针 交替检查结束
6、通过上述操作后 将列表分成了 两个区 一个大于该选取数的区 一个小于该选取数的区
7、重复上述的过程 直到左指针等于右指针
"""
if start >= end:
"""
# 该情况就是上述出现的 start:第一次移动右指针等于了左指针 选取的数是该列表中最大的值 结束
"""
return
"""
left_pointer:一共三种情况 第一种 第一次进来指定的开始左指针为列表的开头0
第二种 递归调用 分治的选取值的左边的区间也就是小于选取值的区间 开始值同样为0
第三种 递归调用 分治的选取值的右边的区间也就是大于选取值的区间 开始值为上次left_pointer的值+1 不包括上次的选取值
right_pointer:一共三种情况 第一种 第一次进来为指定的有指针的开始位置即列表的末尾
第二种 递归调用 分治的选取值左边的区间,也就是小于选取值的区间 结束值为上次left_pointer-1 不包括上次的选取值
第三种 递归调用 分治的选取值右边的区间,也就是大于选取值的区间 结束值为列表的末尾 及end
axis_value:一共三种情况 第一种 第一次进来为列表下标为0的元素
第二种 递归调用 分治的选取值的左边区间,即小于上次选取值的区间 选取的元素为分治后列表开头位置 即下标为0
第三种 递归调用 分治的选取的右边区间,即大于上次选取值的区间,选取的元素为分治后上次left_pointer+1 的值
"""
left_pointer = start
right_pointer = end
axis_value = array[left_pointer]
while left_pointer < right_pointer:
"""
选取的元素为列表开头的元素 所以我们先进行右移 条件为左指针小于有指针 并且值要大于等于选取的值
满足条件,那么右移指针+1 否则说明找到了小于选取值得元素或者左指针等于了右指针,
因为选取值已经提取出来,所以将left_pointer位置换为该小于选取值的值
接着进行左移
"""
while left_pointer < right_pointer and array[right_pointer] >= axis_value:
right_pointer -= 1
array[left_pointer] = array[right_pointer]
"""
选取的值为列表末尾的元素,已经进了右移,进行左移。条件为:左指针小于有指针,并且值要小于选取的值
满足条件,那么左移指针+1,否则说明找到了大于选取值的元素,或者左指针等于了有指针
因为右移时的已经将右移指针的值赋值到了left_pointer,所以将该大于选取值的该值赋值于right_pointer
如果当前left_pointer小于right_pointer 则进行下一次循环
最后 将选取的值放到left_pointer位置 因为大于选取值的元素已经放到了右边,小于选取值的元素已经放到了左边
left_pointer与right_pointer 位置已空 放为选取值
"""
while left_pointer < right_pointer and array[left_pointer] < axis_value:
left_pointer += 1
array[right_pointer] = array[left_pointer]
array[left_pointer] = axis_value
quick_sort(array, start, left_pointer - 1)
quick_sort(array, left_pointer + 1, end)
return array
if __name__ == '__main__':
array_list = [0, 3, 9, 4, 6, 5, 11, 7, 8]
print(quick_sort(array_list, 0, len(array_list) - 1))