加入收藏 | 设为首页 | 会员中心 | 我要投稿 百客网 - 百科网 (https://www.baikewang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

六种方法数组排序

发布时间:2022-10-13 11:01:01 所属栏目:PHP教程 来源:
导读:  请用多种方法解决如下题目:

  给出正整数数组 array = [2,1,5,3,8,4,9,5] 请写出一个函数 sort,使得 sort(array) 得到从小到大排好序的数组 [1,2,3,4,5,5,8,9] 新的数组可以是在 array 自身上改的,也可
  请用多种方法解决如下题目:
 
  给出正整数数组 array = [2,1,5,3,8,4,9,5] 请写出一个函数 sort,使得 sort(array) 得到从小到大排好序的数组 [1,2,3,4,5,5,8,9] 新的数组可以是在 array 自身上改的,也可以是完全新开辟的内存。不得使用 JS 内置的 sort API
 
  答:
 
  (1)使用选择排序和循环:
 
  let sort = (numbers) => {
      for(let i=0; i<numbers.length -1; i++){
          let index = minIndex(numbers.slice(i))+ i
          if(index!==i){swap(numbers, index, i)
          }
      }
      return numbers
  }
  ?
  let swap = (array, i ,j) =>{
      let temp = array[i]
      array[i] = array[j]
      array[j] = temp
  }
  let minIndex = (numbers) =>{
      let index = 0
      for(let i=1; i<numbers.length; i++){
          if(numbers[i] < numbers[index]){
              index = i
          }
      }
      return index
  }
  ?
  let array = [2,1,5,3,8,4,9,5]
  sort(array)
  (2)使用选择排序和递归:
 
  let sort = (numbers) => {
      if(numbers.length >2){
          let index = minIndex(numbers)
          let min = numbers[index]
          numbers.splice(index, 1)
          // 从 numbers 里删掉 min
          return [min].concat(sort(numbers))
      }else{
          return numbers[0]<numbers[1] ? numbers : numbers.reverse()
      }
  }
  let minIndex = (numbers) => numbers.indexOf(min(numbers))
  let min = (numbers) => {
      if(numbers.length > 2){
          return min(
              [numbers[0], min(numbers.slice(1))]
          )
      }else{
          return Math.min.apply(null,numbers)
      }
  }
  ?
  let array = [2,1,5,3,8,4,9,5]
  sort(array)
  (3)快速排序
 
  Quick sort 以某某为基准,小的去前,大的去后。
 
  let sort = arr => {
      if(arr.length <= 1){return arr}
      let pivotIndex = Math.floor(arr.length / 2)
      let pivot = arr.splice(pivotIndex, 1)[0]
      let left = []
      let right = []
      for(let i=0; i<arr.length; i++){
          if(arr[i] < pivot) {left.push(arr[i])
          }else {right.push(arr[i])}
      }
      return sort(left).concat(
          [pivot], sort(right)
      )
  }
  ?
  let array = [2,1,5,3,8,4,9,5]
  sort(array)
  (4)归并排序
 
  Merge sort 左一半,右一半排好,然后左右合并。
 
  let sort = arr =>{
      let k = arr.length
      if(k===1){return arr}
      let left = arr.slice(0,Math.floor(k/2))
      let right = arr.slice(Math.floor(k/2))
      return merge(sort(left),sort(right))
  }
  let merge = (a,b)=>{
      if(a.length === 0) return b
      if(b.length === 0)return a
      return a[0] > b[0] ? [b[0]].concat(merge(a,b.slice(1))) : [a[0]].concat(merge(a.slice(1), b))
  }
  ?
  let array = [2,1,5,3,8,4,9,5]
  sort(array)
  (5)计数排序
 
  就像整理扑克牌一样,发现一张牌就+1;引入哈希表记录。
 
  let sort = arr =>{
      let hashTable = {}, max = 0, result = []
      for(let i=0; i<arr.length; i++){  //遍历数组
          if(!(arr[i] in hashTable)){
              hashTable[arr[i]] = 1
          }else{
              hashTable[arr[i]] += 1
          }
          if(arr[i] > max) {max = arr[i]}
      }
      for(let j=0; j<=max; j++){ // 遍历哈希表
          if(j in hashTable){
              for(let i=0; i < hashTable[j]; i++){ // 解决出现多次
                  result.push(j)
              }
          }
      }
      return result
  }
  ?
  let array = [2,1,5,3,8,4,9,5]
  sort(array)
  (6)循环嵌套
 
  sort = arr => {
      // 外层循环控制用于从头到尾的比较加交换到底有多少轮
      for(let i=0;i<arr.length-1;i++){
          // 内存循环用来完成每一轮遍历中的重复比较加交换
          for(let j=0;j<arr.length-1;j++){
              if(arr[j]>arr[j+1]){
                  // 交换二者
                  [arr[j], arr[j+1]] = [arr[j+1], arr[j]]
              }
          }
      }
      // 返回数组
      return arr
  }
  ?
  let array = [2,1,5,3,8,4,9,5]
  sort(array)
  当然解决的办法有很多PHP数组排序,能理解这些算法的思想的话,我相信对我们都会有很大的益处。
 

(编辑:百客网 - 百科网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!