排序

作者: lacduang | 来源:发表于2019-08-13 00:25 被阅读0次
  • 合并两个有序数组
function merge(arr1, arr2) {
  var merge_arr = []
  var index_1 = 0
  var index_2 = 0

  while(index_1 < arr1.length && index_2 < arr2.length) {
    if(arr1[index_1] <= arr2[index_2]) {
      merge_arr.push(arr1[index_1])
      index_1++
    } else {
      merge_arr.push(arr2[index_2])
      index_2++
    }
  }

  // arr1 有剩余
  if(index_1 < arr1.length) {
    while(index_1 < arr1.length) {
      merge_arr.push(arr1[index_1])
      index_1++
    }
  }

  // arr2 有剩余
  if(index_2 < arr2.length) {
    while(index_2 < arr2.length) {
      merge_arr.push(arr2[index_2])
      index_2++
    }
  }

  return merge_arr
}

// console.log(merge([1,3,5],[2,4,6]))    [1,2,3,4,5,6]
  • 归并算法
    • 分治法将一个大的问题, 转化分解成若干个子问题, 当每个子问题都解决之后, 大的问题也就随之解决。
function merge_sort_ex(arr, start, end) {
  if(start < end) {
    // 分
    var middle = Math.floor((start + end)/2)
    var arr1 = merge_sort_ex(arr, start, middle)
    var arr2 = merge_sort_ex(arr, middle+1, end)

    // 治
    return merge(arr1, arr2)
  }
  return [arr[end]]
}

function merge_sort(arr) {
  return merge_sort_ex(arr, 0, arr.length - 1)
}

// var arr = [3,5,1,2,8,0,6]
// console.log(merge_sort(arr))    [0,1,2,3,5,6,8]
  • 快速排序
    • 取 arr[start]为基准值,将start到end这个区域进行分区
function partition(arr, start, end) {
  var pivotpos = start
  var pivot = arr[start]

  for(var i = start + 1; i <= end; i++) {
    if(arr[i] < pivot) {
      pivotpos++
      if(pivotpos != i) {
        // 将小于基准的值交换到左侧
        var temp = arr[pivotpos]
        arr[pivotpos] = arr[i]
        arr[i] = temp
      }
    }
  }

  arr[start] = arr[pivotpos]
  arr[pivotpos] = pivot

  return pivotpos
}

function quick_sort_ex(arr, start, end) {
  if(start < end) {
    var pivotpos = partition(arr, start, end)
    quick_sort_ex(arr, start, pivotpos-1)
    quick_sort_ex(arr, pivotpos+1, end)
  }
}
function quick_sort(arr) {
  quick_sort_ex(arr, 0, arr.length -1)
}
// var arr = [7,2,8,1,4,6,9,3]
// quick_sort(arr)
// console.log(arr)    [1,2,3,4,5,6,7,8,9]
  • 直接插入排序
    • 当插入第(i>=1)个元素时,假设前面从arr[0]到arr[i-1]已经有序,那么只需要arr[i]和前面那些有序的数值进行比较,找到自己应该插入的位置即可,原来位置上的元素一次向后顺移
function insert_sort(arr, start, end) {
  for(var i = start +1; i <= end; i++) {
    if(arr[i] < arr[i-1]) {
      var tmp = arr[i]
      var j = i-1
      // 找到tmp 应该放的位置
      while(j>=start && tmp<arr[j]){
        arr[j+1] = arr[j]
        j--
      }
      arr[j+1] = tmp
    }
  }
}

// var arr = [7,2,8,1,4,6,9,3]
// insert_sort(arr, 0, arr.length-1)
// console.log(arr)   [1,2,3,4,5,6,7,8,9]
  • 快速排序改进
function quick_sort_ex2(arr, start, end) {
  if(start < end) {
    if(end-start <= 25) {
      insert_sort(arr, start, end)
    } else {
      var pivotpos = partition(arr, start, end)
      quick_sort_ex2(arr, start, pivotpos - 1)
      quick_sort_ex2(arr, pivotpos + 1,end)
    }
  }
}
function quick_sort2(arr) {
  quick_sort_ex2(arr, 0, arr.length-1)
}
// var arr = [7,2,8,1,4,6,9,3]
// quick_sort(arr, 0, arr.length-1)
// console.log(arr)
  • 二分查找
function binary_search(arr, target, start, end) {
  if(start > end) {
    return -1
  }
  var middle = Math.floor((start+end)/2)
  if(arr[middle] == target) {
    return middle
  } else if(middle > target) {
    // 去左侧查找
    binary_search(arr, target, start, middle-1)
  } else {
    // 去右侧查找
    return binary_search(arr, target, middle+1, end)
  }
}
  • 利用二分查找找到第一个比 target 大的值的位置
function binary_search_bigger(arr, target, start, end) {
  if(arr[start] > target) {
    return start
  }
  if(start > end) {
    return -1
  }
  var middle = Math.floor((start+end)/2)
  if(arr[middle] <= target) {
    if(arr[middle+1] > target) {
      return middle + 1
    }
    return binary_search_bigger(arr, target, middle+1, end)
  }
  return binary_search_bigger(arr, target, start, middle+1)
}

var arr = [1,3,4,6,7,8,9,18,18,20]
console.log(binary_search_bigger(arr, 18, 0, arr.length-1))
console.log(binary_search_bigger(arr, 0, 0, arr.length-1))

相关文章

  • 【恋上数据结构与算法二】(一)排序(Sorting)

    排序方法 冒泡排序 选择排序 堆排序 插入排序 归并排序 快速排序 希尔排序 计数排序 基数排序 桶排序 初识排序...

  • 排序-冒泡排序

    排序系列传递门 排序—选择排序排序—快速排序排序—插入排序排序-希尔排序(待完善)排序—归并排序(待完善)排序—基...

  • 排序

    冒泡排序: 冒泡排序 选择排序: 插入排序: 希尔排序: 归并排序: 快速排序: 堆排序: 计数排序: 桶排序: ...

  • Java | 10种排序算法

    冒泡排序 选择排序 插入排序 希尔排序 计数排序 基数排序 堆排序 归并排序 快速排序 桶排序

  • 常见的排序

    冒泡排序: 选择排序: 插入排序: 快速排序: 希尔排序: 归并排序: 堆排序: 计数排序: 桶排序: 基数排序:

  • 002--20200409刷题

    冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序

  • 排序

    排序 符号:Θ 插入排序 选择排序 堆排序 归并排序 冒泡排序 快速排序 桶排序 基数排序 计数排序 插入排序 插...

  • 排序 -- 选择/插入

    聊聊排序吧 冒泡排序 选择排序 插入排序 快速排序 归并排序 计数排序 桶排序 堆排序 本篇 选择排序与插入排序 ...

  • 前端基础整理 | 算法基础

    排序算法 冒泡排序 选择排序 插入排序 希尔排序 归并排序 堆排序 快速排序

  • Java 常见的 8 种排序算法(内排序)

    排序分类 内部排序 插入排序:直接插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:直接选择排序、堆排序...

网友评论

      本文标题:排序

      本文链接:https://www.haomeiwen.com/subject/kadmjctx.html