quicksort 快速排序

javascript

function qsort(a, comp) {
	if (typeof comp==="undefined") {
		comp = function(a, b) {
			return a - b < 0;
		}
	}
	function _qsort(a, low, high) {
		if (!comp(low, high)) {
			return;
		}
		var first = low,
			last = high,
			pivot = a[first];
		while (comp(first, last)) {
			while (comp(first, last) && !comp(a[last], pivot)) {
				--last;
			}
			a[first] = a[last];
			while (comp(first, last) && !comp(pivot, a[first])) {
				++first;
			}
			a[last] = a[first];
		}
		a[first] = pivot;
		_qsort(a, low, first-1);
		_qsort(a, first+1, high);
	}

	return _qsort(a, 0, a.length-1);
}

// quicksort
var a = [57, 68, 59, 52, 52, 72, 28, 96, 33, 24];
qsort(a);
console.log(a); // [24, 28, 33, 52, 52, 57, 59, 68, 72, 96]

  

原文地址:https://www.cnblogs.com/mingzhanghui/p/9274431.html

时间: 2024-11-06 17:11:13

quicksort 快速排序的相关文章

算法分析之——quick-sort快速排序

快速排序是一种排序算法,最坏情况运行时间为θ(n2),但其最佳期望运行时间为θ(nlgn),并且θ(nlgn)记号中隐含的常数因子很小,快排是在就地排序的一种排序算法.快排是基于分治思想的,与归并排序一样.快速排序是一种不稳定的排序算法,因为算法实现过程中涉及到元素交换. 思路: (1)分解:数组A[n]被划分两个字数组A[0..q-1]和A[q+1..n],使得对于数组A[0..q-1]中的元素都小于A[q], A[q+1..n]中的元素都大于等于A[q].此时A[q]就得排好序. (2)解决

[硕.Love Python] QuickSort(快速排序)

def partition(a, i, j):     k = -1     while True:         while k * (a[i] - a[j]) >= 0:             if i == j:                  return i             j += k         a[i], a[j] = a[j], a[i]         i, j, k = j, i - k, -k def qsort(a, i, j):     if i <

QuickSort快速排序的多种实现

并不是很懂wikipedia上面说快排的空间复杂度最坏情况是O(NlogN)啊,难道不是空间复杂度平均O(logN),最坏O(N)么--原地快排难道不是只要算递归栈深度就好了么--有谁给我解释一下啊(评论区orz). 快排的核心思想我感觉就是选一个pivot,然后将待排序数列通过与pivot比较分为两个部分A和B(A部分的数均小于或等于pivot,B部分均大于或等于pivot),这样划分好的数列中的数就处于A <= pivot <= B的状态,接着对划分好的两个部分A和B分别递归调用快排函数,

希尔排序和快速排序

//希尔排序 在直接插入排序算法中,每次插入一个数,使有序序列只增加1个节点,并且对插入下一个数没有提供任何帮助. 如果比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换. D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想.算法先将要排序的一组数按某个增量d分成若干组, 每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序. 当增量减到1时,整个要排序的数被分成一组,排序完成 p

java基础算法之快速排序

快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.fighting 算法概念 快速排序由C. A. R. Hoare在1962(50多年了呢)年提出,它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有

快速排序示例-java

package Quicksort; /** * 快速排序 * @author Administrator * */public class TestMain { /** * * @param start 开始位置 * @param end 结束位置 */ public static void sortArray(int[] array,int start,int end) { if(start >= end) { return ; } int startIndex = start; int e

快速排序算法2---以第一个元素作为主元

前面写过一个关于快速排序的算法,那个写得很仔细了,对于理解快排的思想是足够,也很好的.但近期在做笔试的题目碰到的关于快速的排序的题目,发现一般题目都是指定数组的第一个元素做主元,而我却比较擅长把最后一个元素作为主元,搞得很尴尬.其实要想达到快排最好的时间复杂度,除了待排序的数组是无序外,主元的选择也是一个决定因素,选择第一个和最后一个元素作为主元,其实都不是最好的选择.只有在随机挑选主元才是有可能达到最好的时间复杂度的. 假设要排序是A[0]……A[N-1],首先选用数组的第一个数作为关键数据,

数据结构-快速排序算法

一趟快速排序的算法是: 1)设置两个变量i.j,排序开始的时候:i=0,j=N-1: 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]: 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换: 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换: 5)重复第3.4步,直到i=j: (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于ke

几种排序方式的java实现(01:插入排序,冒泡排序,选择排序,快速排序)

以下为集中排序的java代码实现(部分是在引用别人代码): 插入排序(InsertSort): //代码原理 public static void iSort(int[] a){ for(int i = 1;i < a.length; i++){ if(a[i] < a[i-1]){ int temp = a[i]; while(temp < a[i-1]){ a[i] = a[i-1]; if(i-1 > 0){ i--; }else{ break; } } a[i-1] = t