归并排序
归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(n log n)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
上一章我们大概了解了一下“插入排序”,并且使用js对插入排序进行了实现。本章紧接着谈到“归并排序”,因为这里要用到“插入排序”算法评估的最佳场景。
假设数组Array[1,N],且该数组为从小到大已正向排序的,现需将数值Value插入到该数组,当且仅当Value < Array[1]时只需要做一次比较运算即可得到插入位置,这种情况是“插入排序”的最佳场景。
代码
"use strict";
var arr = [5,2,4,6,1,3];
function sort(arr){
let len = arr.length;
merge(arr,0,len-1,len-1);
console.log(arr);
}
function merge(arr,start,end){
if(start >= end){
return;
}
//以数组的中点为分界线,分别对左右2段进行排序
let middle = Math.floor((start + end)/2);
merge(arr,start,middle);
merge(arr,middle + 1,end);
let s = start,
m = middle,
i,
tmp;
/**
* 2个已排序的数组进行合并
* arr[s,m]为Left数组,arr[m+1,end]为Right数组
* 利用插入排序的最优场景,将arr[m+1,end]中的
*一次遍历结束的标志是:2个数组都为空(全部扫描)
*
*/
while( s <= m && m < end){
//正向排序的最优处理方案,将一个值插入到所有值都比该数值都大的正向数组中
if(arr[s] >= arr[m + 1]){
tmp = arr[m + 1];
for(i = m ; i >= s ; i--){
arr[i + 1] = arr[i];
}
arr[s] = tmp;
m++;
}else{
//缩小下一次检索的范围
s++;
}
}
}
sort(arr);
时间: 2024-10-11 12:38:41