排序是指以特定顺序(数字或字母)排列线性表的元素。排序通常与搜索一起配合使用。
有许多排序算法,而迄今为止最快的算法之一是快速排序(Quicksort)。
快速排序用分治策略对给定的列表元素进行排序。这意味着算法将问题分解为子问题,直到子问题变得足够简单可以直接解决为止。
从算法上讲,这可以用递归或循环实现。但是对于这个问题,用递归法更为自然。
先看一下快速排序的工作原理:
接下来通过一个例子理解这些步骤。假设有一个含有未排序元素[7,-2,4,1,6,5,0,-4,2]的数组。选择最后一个元素作为基准。数组的分解步骤如下图所示:
在算法的步骤1中被选为基准的元素带颜色。分区后,基准元素始终处于数组中的正确位置。
黑色粗体边框的数组表示该特定递归分支结束时的样子,最后得到的数组只包含一个元素。
最后可以看到该算法的结果排序。
这一算法的主干是“分区”步骤。无论用递归还是循环的方法,这个步骤都是一样的。
正是因为这个特点,首先编写为数组分区的代码partition():
空数组和仅包含一个元素的数组被视为已排序。
最后用下面的例子进行测试:
与大多数的递归到循环的转换方案一样,最先想到的是用栈来模拟递归调用。这样做可以重用一些我们熟悉的递归逻辑,并在循环中使用。
我们需要一种跟踪剩下的未排序子数组的方法。一种方法是简单地把“成对”的元素保留在堆栈中,用来表示给定未排序子数组的start和end。
JavaScript没有显式的栈数据结构,但是数组支持push()和pop()函数。但是不支持peek()函数,所以必须用stack[stack.length-1]手动检查栈顶。
我们将使用与递归方法相同的“分区”功能。看看如何编写Quicksort部分:
在图中也把最后一个元素作为基准。给定数组分区后,递归遍历左侧,直到将其完全排序为止。然后对右侧进行排序。
快速排序不会占用任何额外的空间(不包括为递归调用保留的空间)。这种算法被称为in-place算法,不需要额外的空间。
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!