三种基本排序


三种基本排序

/**
name: 快速排序
1. 在数据集之中,选择一个元素作为"基准"(pivot)。
2. 所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
3. 对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
*/
function quickSort(arr){
    if(arr.length <= 1){
        return arr;
    }

   let middle = Math.floor(arr.length / 2 );
   let e = arr.splice( middle, 1)[0];

   let left = [], right = [];

    arr.forEach( v => {
        if( v < e ){
             left.push( v );
        } else {
            right.push(v);
        }
    });

    return quickSort(left).concat( [e], quickSort(right));
}
/**
name: 选择排序
1. 拿第一个数与后面数相比较,如果比后面的数大则交换
2. 拿第二个数与后面的数比较,如果比后面的数大则交换
3. 直到比较到倒数第二个数,最后一个数不用比较
*/
function selectSort(arr){
    let len = arr.length;
    for(let i = 0; i < len; i++){
        for(let j = i; j < len; j++){
            if( arr[j] < arr[i]){
                arr[i] = arr[i] + arr[j];
                arr[j] = arr[i] - arr[j];
                arr[i] = arr[i] - arr[j];
            }
        }
    }
    return arr;
}


/**
name: 冒泡排序
1. 每轮依次比较相邻两个数的大小,后面比前面小则交换
*/
function bubbleSort(arr){
    let len = arr.length;
    for( let i = 0; i < len-1; i++){
        for(let j = 0; j < len-i-1; j++){
            if(arr[j+1] < arr[j]){
                arr[j] = arr[j+1] + arr[j];
                arr[j+1] = arr[j] - arr[j+1];
                arr[j] = arr[j] - arr[j+1];
            }
        }
    }
    return arr;
}

延伸

快速交换两个变量的方法:

  1. 位运算
var a = 1, b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log(a,b);
  1. 解构赋值
var a = 1, b = 2;
[a, b] = [b, a];
console.log(a,b);
var a = 1, b = 2;
a = [b, b=a][0];
console.log(a,b);
var a = 1, b = 2;
a = a + b;
b = a - b;
a = a - b;
console.log(a,b);