算法的效率可以用**时间复杂度O(N)**来度量。时间复杂度反应了程序执行时间随输入规模增长而增长的量级,很大程度上能反应算法的优略程度。
我们最开始认识的排序方法有冒泡排序和选择排序但是这个算法的效率怎么样呢,让我们来测试一下。
首先,我们随机生成一个长度为100000的随机数组,并选用选择排序的方法来对数组进行排序,并测试所花的时间。
结果如下,大概花费了9757ms:
然后,我们再使用冒泡排序来测试一下。
我们发现,冒泡排序花费的时间更长。如下图所示:
下面我们了解一下适合处理较大数据的快速排序。
快速排序:把数组通过一次排序分割成三部分:左半部分、中间数、右半部分,左半部分的数全部都比右半部分小。然后对左半部分和右半部分分别再进行一次排序,再分割,这样循环下去,直到不能再分割为止。它能达到最佳和平均时间复杂度均为O(n·logn)。
tips:计算消耗时间的另一种方法:
console.time();
//这里是要计算消耗时间的代码
console.timeEnd();
快速排序算法实现如下:
let randomarr = new Array(100000)
.fill(0)
.map((item, index, array)=> index)
.sort(()=> Math.random()-.5);
//寻找中间数
function findMid(arr, left, right){
while(left < right){
while(left < right && arr[left] <= arr[right]){
right--;
}
[arr[left],arr[right]] = [arr[right],arr[left]];
while(left < right && arr[left] < arr[right]){
left++;
}
[arr[left],arr[right]] = [arr[right],arr[left]];
}
return left;
}
//快速排序算法
function QSort(arr, start, end){
if(start >= end) return ;
let mid = findMid(arr, start, end);
QSort(arr, start, mid - 1);
QSort(arr, mid + 1, end);
}
console.time();
QSort(randomarr, 0, 99999);
console.timeEnd();
运行结果如下,与前面两种算法相比,效率大大提高: