数据结构与算法-十大排序

116 阅读1分钟

为什么要学算法呢?有一句话是程序=算法+数据结构,学完算法以后能够将很多问题简单化,使你的程序耗时更短,占据更小的内存,提升编码能力

题目:给你一个整数数组 nums= [5,2,3,1],请你将该数组升序排列。

1、冒泡排序

var sortArray = function(nums) {
    let len = nums.length
    if(len <= 1){
       return nums
    }
    for(let i = 0; i< len-1; i++){
        for(let j= 0; j < len-1-i; j++){
           if(nums[j] > nums [j+1]){
               [nums[j], nums[j+1]] = [nums[j+1], nums[j]]
           }
        }
    }
    return nums
};

2、选择排序

var sortArray = function(nums) {
    let len  = nums.length
    if(len <=1 ){
        return nums
    }
   for(let i=0; i<len-1; i++){
       let minIndex = i
       for(let j= i+1; j<len; j++){
            if(nums[j] < nums[minIndex]){
                minIndex = j
            }
       }
        if(minIndex!==i){
                [nums[minIndex], nums[i]] = [nums[i], nums[minIndex]]

        }
   }
   return nums
};

3、插入排序

var sortArray = function(nums) {
    let len  = nums.length
    if(len ===1 ){
        return nums
    }
  for(let i=1; i<len; i++){
      for(let j=i; j>0 && (nums[j] < nums[j-1]); j--){
          [nums[j], nums[j-1]] = [nums[j-1], nums[j]]
      }
  }
   return nums
};

4、希尔排序

var sortArray = function(nums) {
    let len = nums.length
    if(len <= 1){
       return nums
    }
 function swap(a,i,j){
     [a[i], a[j]] = [a[j], a[i]]
 }
 let h = 1
 while(h< len/3){
   h = 3*h+1
 }
 while(h>=1){
     for(let i = h; i<len; i++) {
         for(let j= i; (j>=h) && nums[j] < nums[j-h]; j-=h){
            swap(nums, j,j-h)   
         }
     }
     h = Math.floor(h/3)
 }
 return nums
};

5、快速排序

var sortArray = function(nums) {
    let len  = nums.length
    if(len ===1 ){
        return nums
    }
  quickSort(nums, 0, len-1)
  function quickSort(nums, left, right){
      if(left<right){
          let pivot = partition(nums, left, right)
          console.log(nums, pivot)
          quickSort(nums, left, pivot-1)
          quickSort(nums, pivot+1, right)
      }
  }


  function partition(nums, left, right){
      let i = left, j = right+1
      let pivot = nums[left]
      while(1){
          // 这个循环结束的条件就是nums[++i]>=pivot
          // nums[--j]>=pivot
          while(nums[++i]<pivot){
               if(i===right){
                   break
               }
          }
          while(pivot< nums[--j]){
              if(j === left){
                  break
              }
          }
        //   console.log('oo', i, j)
          if(i>=j){
             break
          }
          [ nums[i], nums[j]] = [ nums[j], nums[i]]
      }
      [nums[left], nums[j]] = [nums[j], nums[left]]
      return j
  }
  return nums
};

6、归并排序

var sortArray = function(nums) {
  function merge(left, right){
      const res = []
      while(left.length>0 && right.length> 0){
          if(left[0]<right[0]){
              res.push(left.shift())
          }else{
              res.push(right.shift())
          }
      }
      return res.concat(left).concat(right)
  }
  function mergeSort(nums){
      const len = nums.length
      if(len === 1){
          return nums
      }
      const mid = len>>1
      const left = nums.slice(0, mid)
      const right = nums.slice(mid)
      return merge(mergeSort(left), mergeSort(right))
  }
  nums = mergeSort(nums)
  return nums
};

7、计数排序

var sortArray = function(nums) {
   let len = nums.length
   if(len < 2){
       return nums
   }
   // 5 5 2 3 1
//    count = [undefined, 1 , 1, 1, undefined, 2]
    let min = nums[0]
    let max = nums[0]
    for(let i=1; i<len; i++){
        if(nums[i] < min){
            min = nums[i]
        }else if(nums[i] > max){
            max = nums[i]
        }
    }
   const count = new Array(max - min + 1)
   for(let i=0; i<len; i++){
       const  j = nums[i] -min
       if(count[j]){
           count[j]++
       }else{
           count[j] = 1
       }
   }

   const res = []
   for(let j=0; j<count.length; j++){
     while(count[j]>0){
         res.push(j)
         count[j] --
     }
   }
   return res
};