数据结构与算法:快速排序(原理讲解+python实现)
快速排序
快速排序是一种基于分治法(Divide and Conquer)的排序算法 它之所以称为快速排序是因为它的平均时间复杂度为O(nlogn),最坏情况下是O(n2) 但是这样的情况不常见 一般需要每次划分的左右两边元素个数为1个和n-1个 比如已排好序的数组。大部分的情况都会是大致均匀划分的情况。
原理讲解
基于分治法,快速排序操作步骤如下:
1. 选择一个基准值(pivot) 在这里 我选择列表第一个元素作为基准值
2.将数组中比pivot小于或者等于的元素交换到pivot前面;将比pivot大于的元素交换到pivot后面
3.将已经分好的两个左右子列表 重复2操作
Python实现
1 def getIndex(arr, l, r): 2 tmp = arr[l] #10 3 while (l < r): 4 while (l<r and tmp < arr[r]): 5 r -= 1 6 arr[l] = arr[r] 7 while (l<r and tmp >= arr[l]): 8 l += 1 9 arr[r] = arr[l] 10 arr[l] = tmp 11 return l 12 13 def QuickSort(arr, l, r): 14 if l<r: 15 index = getIndex(arr, l, r) 16 QuickSort(arr, l, index-1) 17 QuickSort(arr, index+1, r) 18 19 if __name__ == '__main__': 20 Arr = [10, 20, 30, 40 ,50] 21 QuickSort(Arr, 0, len(Arr)-1) 22 print(Arr)
时间、空间复杂度;稳定性分析
时间复杂度:平均时间复杂度为O(nlogn); 最好O(nlogn) 最差O(n*n). 最理想的情况就是每次折半时都能够分成均匀的两半。最差的情况是每次折半只确定一个元素的位置结果就是要分n次
空间复杂度:代码没有显示开辟新内存 所以O(1) 但是在递归过程中会在后台利用队栈空间存储递归过程中的临时变量 分治的时候用到了递归 所以平均为O(1*logn). 最差是O(n)
稳定性:快速排序为不稳定排序 在交换元素过程中相同元素顺序会发生改变。例如:列表[3,4,5,3,2], 两个3的顺序就会在交换过程发生改变
总结
刚刚写技术博客 每一次写都比预算要的时间要长 而且博客的质量也很一般 但是 无论再精致的博客 也是从开始一篇篇累积一点点成长 到最后写一篇技术博客 用时固定 而且质量高。我唯一要做的就是坚持下去不间断。加油!