#基本思想[升序] 随机找出一个数,可以随机取,也可以固定值(开始,结尾,中间)为基准,然后把比基础小 的值放在左边,比基准大的值放在右边,然后采用此方法对两部分数据分别进行快速排序,整个 过程可以用递归进行,以此达到整个数据排序。 #具体步骤: 1.选择数组中的第一个元素作为基准(pivot); 2.左指针left,从左边开始寻找第一个比pivot大的数; 3.右指针right,从最右边开始寻找第一个比pivot小的数; 4.经过2,3两个步骤会出现以下情况: a:left,right没有相遇,此时交换,swap(arr,left,right) b:left,right相遇,作交换swap(arr,start,left),并返回left; 5.partition中返回pivot用于分割数据,下一次用于排序的数组被分割为 (start,pivot-1)和(pivot+1,end),进行递归操作. # 动图展示: # 代码实现: ## python: `def quickSort(nums): if (len(nums) < 2): return nums mid = nums[len(nums) // 2] left, right = [], [] nums.remove(mid) for item in nums: if item > mid: right.append(item) else: left.append(item) return quickSort(left) + [mid] + quickSort(right)` ## python_NB 牛逼版本 一行代码搞定 `quick_sort = lambda array: array if len(array) <= 1 else quick_sort( [item for item in array[1:] if item <= array[0]]) + [array[0]] + quick_sort( [item for item in array[1:] if item > array[0]])` ##思考: 如果把重复的数字去掉,应该怎么写? 传入参数为nums行不行 为什么? ## C++: `void quick_sort(int nums[], int left, int right) { if (right <= left) return; int val = nums[left];/*基准值*/ int i = left; //从左到右的索引指针 int j = right + 1; //从右道左的索引指针 while (true) { while (nums[++i] < val) { if (i == right)break; } while (nums[--j] > val) { if (j == left)break; } if (i >= j)break; /*交换i,j对应的值*/ int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } /*找分段后的新的基准值*/ int temp = nums[left]; nums[left] = nums[j]; nums[j] = temp; quick_sort(nums, left, j - 1); quick_sort(nums, j + 1, right); }` ## 思考: STL中排序算法是如何实现的?快速->[插入排序,堆排序] https://zhuanlan.zhihu.com/p/36274119 # 时间复杂度分析: https://www.zhihu.com/question/22393997/answer/406278523
quick_sort
最新推荐文章于 2024-10-10 17:42:08 发布