算法入门,排序算法

106 阅读1分钟

选择排序

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 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 numbers = [88,77,11,111,333]

sort(numbers)
//(5) [11, 77, 88, 111, 333]

快速排序

let quickSort = 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 quickSort(left).concat([pivot],quickSort(right))
}

let numbers = [88,77,11,111,333]

quickSort(numbers)
//(5) [11, 77, 88, 111, 333]

归并排序

let mergeSort = arr => {
    if(arr.length===1){return arr}
    let left = arr.slice(0,Math.floor(arr.length/2))
    let right = arr.slice(Math.floor(arr.length/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(b,a.slice(1)))
}

let numbers = [123,234,333,11]

mergeSort(numbers)
//(4) [11, 123, 234, 333]

计数排序

let countSort = 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 numbers = [23,435,6546,11,2]

countSort(numbers)
//(5) [2, 11, 23, 435, 6546]