快速排序(简称快排)因为其效率较高(平均O(nlogn))经常在笔试题中对其考查。
对于快排的第一步是选取一个“基数”,将会用这个“基数”与其它数进行比较交换。而这个“基数”的选择将影响到快排的效率如何,但如果为了选择基数而选择基数则会本末倒置。例如为了找到最佳基数,则需要在整个待排序列中找到中位数,但查找中位数实际上代价又会很高。基数的选择通常来说就是待排序序列中的第一个对象或者中间的一个对象或者最后一个对象。本文以选取第一个元素为例对快排做一个简要分析实现。
以待排序列{6, 5, 3, 1, 7, 2, 4}为例,选取第一个元素6为基数。
选择了基数过后则需要进行和数组元素进行比较交换,如何进行比较和谁进行比较?快排第二步在数组的第一个元素和最后元素各设置一个“哨兵”。
选好基数,设置好哨兵过后,接下来则是开始比较,将基数先与最后一个哨兵j进行比较,如果大于哨兵j则与其进行交换同时哨兵i+1。
此时基数不再与哨兵j进行比较,而是与哨兵i进行比较,如果基数大于哨兵i,则哨兵一直向后移,直到大于基数为止交换同时哨兵j-1。
重复上面的步骤,基数再与哨兵j比较。
最终结果可见哨兵i的位置=哨兵j的位置,此时将基数赋值给这个位置。
这样就达到了基数6左边的数字均小于它,右边的数字均大于它,再利用递归对其左右数组进行同样的步骤选取基数,设置哨兵,最后即可完成排序。
java
package com.algorithm.sort.quick; import java.util.Arrays; /** * 快速排序 * Created by yulinfeng on 2017/6/26. */ public class Quick { public static void main(String[] args) { int[] nums = {6, 5, 3, 1, 7, 2, 4}; nums = quickSort(nums, 0, nums.length - 1); System.out.println(Arrays.toString(nums)); } /** * 快速排序 * @param nums 待排序数组序列 * @param left 数组第一个元素索引 * @param right 数组最后一个元素索引 * @return 排好序的数组序列 */ private static int[] quickSort(int[] nums, int left, int right) { if (left < right) { int temp = nums[left]; //基数 int i = left; //哨兵i int j = right; //哨兵j while (i < j) { while (i < j && nums[j] >= temp) { j--; } if (i < j) { nums[i] = nums[j]; i++; } while (i < j && nums[i] < temp) { i++; } while (i < j) { nums[j] = nums[i]; j--; } } nums[i] = temp; quickSort(nums, left, i - 1); quickSort(nums, i + 1, right); } return nums; } }
Python3
#快速排序 def quick_sort(nums, left, right): if left < right: temp = nums[left] #基数 i = left #哨兵i j = right #哨兵j while i < j: while i < j and nums[j] >= temp: j -= 1 if i < j: nums[i] = nums[j] i += 1 while i < j and nums[i] < temp: i += 1 if i < j: nums[j] = nums[i] j -= 1 nums[i] = temp quick_sort(nums, left, i - 1) quick_sort(nums, i + 1, right) return nums nums = [6, 5, 3, 1, 7, 2, 4] nums = quick_sort(nums, 0, len(nums) - 1) print(nums)
以上这篇比较排序之快速排序(实例代码)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
快速排序,这是一个经典的算法,本文给出几种python的写法,供参考。 特别是python能用一句话实现快速排序。 思路说明 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。 (1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解
本文向大家介绍javascript与Python快速排序实例对比,包括了javascript与Python快速排序实例对比的使用技巧和注意事项,需要的朋友参考一下 本文实例对比了javascript与Python快速排序实现方法。分享给大家供大家参考。具体如下: js实现方法: python实现方法: 希望本文所述对大家的javascript及Python程序设计有所帮助。
本文向大家介绍JS排序之快速排序详解,包括了JS排序之快速排序详解的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了JS快速排序的具体代码,供大家参考,具体内容如下 说明 时间复杂度指的是一个算法执行所耗费的时间 空间复杂度指运行完一个程序所需内存的大小 稳定指,如果a=b,a在b的前面,排序后a仍然在b的前面 不稳定指,如果a=b,a在b的前面,排序后可能会交换位置 --JS快速排序--
本文向大家介绍Scala实现冒泡排序、归并排序和快速排序的示例代码,包括了Scala实现冒泡排序、归并排序和快速排序的示例代码的使用技巧和注意事项,需要的朋友参考一下 1、冒泡排序 2、归并排序 3、快速排序 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
问题内容: [http://jsperf.com/optimized-mergesort-versus- quicksort][1] 为什么这个半缓冲区合并排序的工作速度与quicksort一样快? QuickSort是: 就地虽然会占用递归(堆栈空间) 缓存友好 这一半缓冲区合并排序: 使用Buffer进行合并。 使用递归。 进行较少的比较。 我的问题是,在这种情况下,为什么半缓冲区合并排序与Q
本文向大家介绍java冒泡排序和快速排序代码,包括了java冒泡排序和快速排序代码的使用技巧和注意事项,需要的朋友参考一下 冒泡排序: 基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 快速排序: 算法:当数据量很大适宜采用该方法。采用二分