快排小知
就拿快速排序来说,相比其他的排序来说这是一个非常高效的算法,怎么个高效呢?空说无凭。我们知道衡量一个算法的效率要从它的时间复杂度和空间复杂度上分析。那么我们快速排序的时间复杂度相比与冒泡仅仅为O(nlogn),空间复杂度为O(n)。虽然以前也经常接触到,但对其的理解还有很大的不足,我们知道这个算法它利用的是我们分治的思想,简单的来说就是分而治之,逐个击破。
第一步
用户给我们一个数组(list),第一步,我们对拿到的这个数组封装处理,转化为这个列表对象、它的起始下标(frist=0),以及末尾下标(len(list)-1),
第二步
第二步,我们再对特定的子数组进行排序,那么怎么实现这个排序呢?也就是说该如何打造我们的排序函数呢?首先先进行判断,如果这个数组元素个数为零为一,那直接返回就好,否则我们就构造一个分区函数,
分区函数构造
对特定的数组进行分区(初始化一个变量count=1,选取一个基准值key,遍历下一个元素直到末尾,让所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面,还需要将count所指的元素集体向前移动一位,将主元放在空位),并且返回它的主元下标,然后根据这个主元对数组进行切片分成left部分和right部分,递归的调用这个我们已经整理好的函数quick_sort,以此达到让我们的数据排列有序。
代码实现
import random
# 对特定的数组,进行分区,返回主元下标
def division(list, start, end):
# 因为第一个元素肯定符合,所以选择第一个元素作为主元
count = 1
key = list[start]
# 相对关键字进行局部排序
for i in range(start + 1, end + 1):
if list[i] < key:
temp = list[i]
list[i] = list[start + count]
list[start + count] = temp
count += 1
# 集体向前移动
for i in range(count - 1):
list[start + i] = list[start + i + 1]
# 将主元放在空位
list[start + count - 1] = key
# 返回主元下标
return start + count - 1
# 对特定子数组进行排序
def quick_sort(list, frist, last):
if last > frist:
pkindex = division(list, frist, last)
quick_sort(list, frist, pkindex - 1)
quick_sort(list, pkindex + 1, last)
# 封装
def quick_Sort(list):
quick_sort(list, 0, len(list) - 1)
def main():
nums = []
for i in range(10):
h = random.randint(-10000, 10000)
if h not in nums:
nums.append(h)
else:
nums.append(h + 201)
print("原始数据序列:", nums)
c = []
quick_Sort(nums)
for i in nums:
c.append(i)
print("快排数据序列:",c)
if __name__=="__main__":
main()