面试题之排序

49 阅读2分钟

Autumn Is Coming

有时候当你没有坚定下决心做某件事情的时候,任何理由都可能成为阻挡你的原因,我觉得那是因为生活逼得你还是不太紧,当你坚定的要去发生改变时,你会发现的开始成果就会是很大的。不得不说改变对一个人有多重要。

排序有几种方法,这里主要说快速排序和冒泡排序。

冒泡排序

  • 冒泡排序就是将最大数的冒泡到最后
  • 实现思路:将从头开始将相邻的两项相比,每一次对比相邻两个数据的大小,小的排在前面,如果前面的数据比后面的大就交换这两个数的位置,持续直到数据结束。最大的数将会在最后。再重复前边的操作。

let arr = [90,0,-10,88,999,100,102,2,3,20];
function sortArr(arr) {
    let count = 0;
    for (let i=0;i<arr.length;i++){
        for(let j=0;j<arr.length-1-i;j++){
            if(arr[j]>arr[j+1]){
                var temp =arr[j+1];
                arr[j+1]=arr[j];
                arr[j]=temp;
            }
            console.log("第"+(++count)+"次排序后:"+ arr);
        }
    }
    return arr;
}
console.log(sortArr(arr));

images 1

快速排序

  • 先找到一个基准点(一般都是数组中部),然后数组被该基准点分为两部分,依次依次与该基准点比较,如果比基准点小则放在左边,反之放在右边,分别用两个空数组去存储比较后的数据,最后然后在重复这个步骤
let arr = [90,0,-10,88,999,100,102,2,3,20];
var times = 0;

function quickSort(arr) {
    if (arr.length<1) {
        return arr;
    }
    let centerIndex = Math.floor(arr.length/2); //取到数组中间的位置

    let centerVal = arr.splice(centerIndex, 1);//获取基准点的值splice(index,1)函数可以返回数组中被删除的那个数arr[index+1]  
    let left = [];  //用来存放左边的数
    let right = []; //用来存放右边的数

    for(var i=0;i<arr.length;i++){  
        if(arr[i]<centerVal){  
            left.push(arr[i]);//比基准点小的放在左边数组  
            console.log("这是left:"+left);
        }  
        else{  
            right.push(arr[i]);//比基准点大的放在右边数组  
            console.log("这是right:"+right);
        } 
    } 
    console.log("第"+(++times)+"次排序后:"+arr);

    //递归执行以上操作,对左右两个数组进行以上操作,直到数组长度为<=1;  
    return quickSort(left).concat(centerVal,quickSort(right));
}

console.log(quickSort(arr));

images 2

  • 直接利用数组的排序方法sort来实现
let arr = [90,0,-10,88,999,100,102,2,3,20];
function compare(a,b) {
    return a-b;
}

var newArr = arr.sort(compare);

console.log(newArr);

images 3