归并排序
归并排序是可以被实际使用的排序算法,其复杂度为O(nlogn)。
思路:归并排序是一种分治算法。其思想是将原始数组切分为较小的数组,知道每个小数组只有一个位置。接着将小数组归并为较大的数组,直到最后只有一个排序完毕的大数组。
由于是分治法,归并排序也是递归的;我们首先定义一个实际被执行的辅助函数。
// 该函数是将一个数组切分为两个数组 function mergeSort(array){ var length = array.length; // 当length为1时,说明已经切割为最小数据,递归的结束条件 if(length == 1){ return array; } var mid = Math.floor(length / 2), left = array.slice(0,mid), right = array.slice(mid,length);
// merge函数,负责将分割的小数组合并
return merge(mergeSort(left), mergeSort(right)) }
function merge(left, right){ var result = [], il = 0, ir = 0; // 这里的left 和 right 分被是两个已经排过序的数组 // 选择两个数组中最小的依次放入结果中,直到一个数组的值完全放进结果集中 // 直到其中的一个数组全部放到结果集中,结束循环 while(il < left.length && ir < right.length){ if(left[il] < right[ir]){ result.push(left[il++]) }else{ result.push(right[ir++]) } } //将还没有完全放进去的那个数组,依次放入结果集,因为每个数组一定是已经排好序的 // 这里的left 与 right 不分先后 因为到这里肯定有一个数组为空, while(il < left.length){ result.push(left[il++]) } while(ir < right.length){ result.push(right[ir++]) } return result; }
主要流程:
算法首先将原始数组分割直至只有一个元素的子数组,然后开始归并。归并过程也会完成排序,直至原始数组完全合并并完成排序。
图示: