常见的三种排序算法(选择,冒泡,计数)

207 阅读2分钟

冒泡排序

冒泡排序的思想:

  • 临近的两个元素互相比价,每轮循环找出剩余元素中最大或最小值,将其放于数组的最后和最前,循环的长度减一。
  • 剩余的元素再重复第一步,直至循环的长度等于1,停止循环,排序完成。
function bubbleSort(arr){
    var i = arr.length,temp, j;
    while(i!==1){
        for(j=0;j<i-1;j++){
            if(arr[j] > arr[j+1]){
                temp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = temp
            }
        }
        i--
    }
    return arr
}

选择排序

  • 两层for循环,内层每次默认最值为外层for循环的变量为下标。内层for循环每次找出最小或最大值的下标。
  • 经过内层循环的一次遍历,将得出的最值与默认的最值位置进行对比,不相等说明默认的最值不是最值,于是交换其值。这样每次就能从剩的值中找出最值并排序。
function selectSort(arr){
    for(let j=0;j<arr.length-1;j++){
        min = j;
        for(let i= j+1;i<arr.length;i++){
            if(arr[min] > arr[i]){
                min = i;
            }
        }
        if(min !== j){
            let temp;
            temp = arr[min]
            arr[min] = arr[j]
            arr[j] = temp
        }
    }
    return arr
}

计数排序

  • 找出数组中最大值,声明一个临时数组。
  • 依靠一个for循环向临时数组中保存传入的数组中的数据,下标代表其值,数组中该下标对应的数值为该数字的个数。
  • 另一个for循环中循环条件小于等于最大值。只要临时数组中的值大于0就向目标数组中保存,目标数组下标值每次自增1,临时数组的值就减一。 for循环完毕即可完成排序。
function countingSort(arr){
    var max = Math.max(..arr);
    var temp = [];
    var num = 0;
    for(let i=0; i<arr.length; i++){
        if(!temp[arr[i]]){
            temp[arr[i]] = 1;
        }else{
            temp[arr[i]]++;
        }
    }
    for(i=0; i<max; i++){
        while(temp[i] > 0){
            arr[num++] = i;
            temp[i]--;
        }
    }
    return arr
}