快速排序是对起泡的一种改进,快速的排序的基本思想就是首先选择一个基数value,然后设置参数i,j。i,j一开始分别指向数组的第一个元素和最后一个元素。然后重复一下的步骤,直到i=j。也就是i和j相遇。
1. 先从j开始以及将数组array[j]的值与value的值进行比较,直到arr[j]<value。这时,交换arr[i]和arr[j]的值,i++;
2. 当交换arr[i]和arr[j]的值之后,这时,我们就需要从i这头开始遍历了,同样的道理,将arr[i]与value比较,直到arr[i]>value。然后交换arr[i]和arr[j]的值,j--;
在快速排序中,记录的移动是从两端向中间进行的,关键码较大的记录一次就能从前面移动到后面,反之亦然。在我们选择了基数,进行记录的划分之后,一般左边的数据小于value的值,右边的数据大于value的值。
快速排序适用于待排序记录个数很大并且原始记录随机排列的情况,并且是一种不稳定的排序算法。
JS代码实现过程:
var arr = [3, 7, 8, 5, 2, 1, 9, 5, 4];
QuickSort(arr);
function QuickSort(arr) {
function sort(arr, first, last) {
if (first >= last) {
return;
}
var value = arr[first - 1]; //基数,每次都取第一个记录为基数
var i = first - 1;
var j = last - 1;
while (i < j) {
for (; i < j; j--) {
if (arr[j] < value) {
arr[i++] = arr[j];//当满足条件的时候,交换两数的值,并将i或j相应的++或--
break;
}
}
for (; i < j; i++) {
if (arr[i] > value) {
arr[j--] = arr[i];
break;
}
}
}
arr[i] = value;
sort(arr, first, i);//递归实现左侧排序
sort(arr, i + 2, last);//递归实现右侧排序
}
sort(arr, 1, arr.length);
}