归并排序和快速排序计时计算——谁更快?

今天复习了归并和快排,突然想计算一下他们的速度差别到底有多大~结果还是挺令人意外的,哈哈。

话不多说,看代码。

	let arr = [];
	for (let i = 0; i < 500000; i++) {
	    arr.push(Math.round((Math.random() * 1000)));
	}
	let start = new Date().getTime();
	
	/**
	 * 快速排序
	 */
	function quickSort(arr) {
	
	    if (arr.length <= 1) {
	        return arr;
	    }
	
	    let mid = arr.length >> 1;
	    let midValue = arr.splice(mid, 1);
	    let left = [];
	    let right = [];
	
	    for (let i = 0; i < arr.length; i++) {
	        if (arr[i] < midValue) {
	            left.push(arr[i]);
	        } else {
	            right.push(arr[i]);
	        }
	    }
	
	    return quickSort(left).concat(midValue, quickSort(right));
	}
	
	/**
	 * 归并排序
	 */
	function mergeSort(arr) {
	    function part(arr, left, right) {
	        if (left == right) {
	            return;
	        }
	        let mid = left + ((right - left) >> 1);
	
	        part(arr, left, mid);
	        part(arr, mid + 1, right);
	
	        let p1 = left;
	        let p2 = mid + 1;
	        let cache = [];
	        let i = 0;
	        while (p1 <= mid && p2 <= right) {
	            cache[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
	        }
	
	        while (p1 <= mid) {
	            cache[i++] = arr[p1++];
	        }
	
	        while (p2 <= right) {
	            cache[i++] = arr[p2++];
	        }
	
	        for (let i = 0; i < cache.length; i++) {
	            arr[left + i] = cache[i];
	        }
	
	        return arr;
	    }
	
	    return part(arr, 0, arr.length - 1);
	}
	
	
	/**
	 * 验证
	 */
	console.log(`结果:[${quickSort(arr)}]`);
	let end = new Date().getTime();
	console.log(`用时:${end - start}毫秒`);

结果

  • 在数组仅有100项的时候
    快排:
    在这里插入图片描述
    归并:
    在这里插入图片描述
    不相上下啊哈哈啊,那么我们直接上二十万项的数组~

  • 数组200000项:
    快排:
    归并排序和快速排序计时计算——谁更快?_第1张图片
    九秒多!
    来看看可爱的归并
    归并排序和快速排序计时计算——谁更快?_第2张图片
    两秒!
    差距这么大的吗?


惊不惊喜,意不意外!
话说回来或许是这次我使用的快排太浪费空间,下次换个好用的试试~

From Raool

你可能感兴趣的:(学习笔记)