JS实现各类排序算法

325 阅读1分钟

1. 递归实现选择排序

let yyy=[345,3456,345,124,45,675678,56,23423,2345,324,23445,6678,788]
let min=(numbers)=>{
if(numbers.length>2){
   return min(
     [numbers[0],min(numbers.slice(1))]
   );
}else{
    return Math.min.apply(null,numbers);
}
};

let minIndex=(numbers)=>{
return numbers.indexOf(min(numbers))
}

let sort=(numbers)=>{
  if(numbers.length>2){
    index=minIndex(numbers)
    minNum=numbers[index]
    numbers.splice(index,1)
    return [minNum].concat(sort(numbers))
  }else{
    return numbers[0]>numbers[1]?numbers.reverse():numbers
  }
}

2. 循环实现选择排序

let minIndex=(numbers)=>{
   let index=0;
  for(let i=0;i<numbers.length;i++){
     if(numbers[i]<numbers[index]){
       index=i
     }
  }
  return index
}
let swap=(numbers,minIndex,index)=>{
  let temp=numbers[minIndex]
  numbers[minIndex]=numbers[index]
  numbers[index]=temp
}
let sort=numbers=>{
   for(let i=0;i<numbers.length;i++){
     let index=minIndex(numbers.slice(i))+i
     if(index!==i){
       swap(numbers,index,i)
     }
   
   }
  return numbers
}

3. 快速排序

//阮一峰老师写法
let quickSort=(numbers)=>{
if(numbers.length<=1){
  return numbers
}
  let left=[]
  let right=[]
  let pivotIndex=Math.floor(numbers.length/2)
  let pivot=numbers.splice(pivotIndex,1)[0]
for(let i=0;i<numbers.length;i++){
  if(numbers[i]<pivot){
    left.push(numbers[i])
  }else{
    right.push(numbers[i])
  }
}
  return quickSort(left).concat([pivot],quickSort(right))
}

let xxx=[324,453,457,3245,654,6456,66]
xxx=quickSort(xxx)
console.log(xxx)

4. 归并排序

let mergeSort=(numbers)=>{
  let n= numbers.length
  if(n===1){return numbers}
  let left=numbers.slice(0,Math.floor(n/2))
  let right=numbers.slice(Math.floor(n/2))

  return merge(mergeSort(left),mergeSort(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))
}

5. 计数排序

let countSort=numbers=>{

  let hashTable={},max=0,result=[]
  for(let i=0;i<numbers.length;i++){
    if(!(numbers[i] in hashTable)){
      hashTable[numbers[i]]=1
    }else{
      hashTable[numbers[i]]+=1
    }
    if(numbers[i]>max){max=numbers[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
}