var brr =[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]functionquickSort(arr){if(arr.length <1){return arr
}var left =[]var right =[]var index = Math.floor(arr.length /2)var midNum = arr.splice(index,1)[0]for(var i =0; i < arr.length ; i++){if(arr[i]< midNum){
left.push(arr[i])}else{
right.push(arr[i])}}returnquickSort(left).concat(midNum,quickSort(right))}
console.log(quickSort(brr))
5 归并排序(二叉树排序)
思想:分治法。
mid=arr.lengt/2,得到数组分割的中间值
将给定的数组从mid分为左右两个数组,只有在分之后数组的length<2时,才停止分配。
对分配的<2的数组进行merge(),最后会得到左右两个有序的数组。
在对左右两个有序的数组进行merge(),取地址为0的数进行比较,最终返回排序。
时间复杂度:O( nlogn )
稳定性:不稳定
var brr =[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]functionmergeSort(arr){var len = arr.length
if(len <2){return arr // 分为1}// 取出mid, (0,mid)的数组left, (mid,end)的数组rightvar mid = Math.floor(len /2),
left = arr.slice(0, mid),
right = arr.slice(mid)// 和,将左右分割为1的数据进行合并returnmerge(mergeSort(left),mergeSort(right))}functionmerge(left, right){// 定义一个返回的数组,初始为[]var result =[]// 如果左右都存在while(left.lenght && right.length){// 取出[0]位置的左右数组的值进行比较if(left[0]<= right[0]){// 移除left[0],并push到result中
result.push(left.shift())}else{// 移除right[0],并push到result中
result.push(right.shift())}}// 由于上面的while执行的时候,只执行了if的一个条件,另外一个数组则没有push到result中while(left.length){
result.push(left.shift())}while(right.length){
result.push(right.shift())}return result
}
console.log(mergeSort(brr))
归并排序图解
6 堆排序
思想:
构建大顶堆。
将堆的最后一个元素与堆顶做交换。
时间复杂度:O( nlogn )
稳定性:不稳定
functionheapSort(arr){for(var i = arr.length -1; i >0; i--){// 1.建立大顶堆heapify(arr, i)// 2. 最后一个子节点跟第一元素交换swap(arr,0, i)}return arr
}functionswap(arr, n, m){var temp = arr[n]
arr[n]= arr[m]
arr[m]= temp
}functionheapify(arr, n){// 先找出最后一个父节点for(let i = Math.floor((n-1)/2); i >=0; i--){// 然后找出这个父节点的左孩子childvar child =2* i +1// 判断这个父节点是否存在右孩子,若右孩子存在,且 右孩子的值 > 左孩子的值 ,则child++if(child != n && arr[child]< arr[child+1]){
child++}// 最后,判断这个arr[child]和父节点的值,是否做交换,执行swap函数if(arr[child]> arr[i]){swap(arr, child, i)}}}var brr =[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48]
console.log(heapSort(brr))