排序

108 阅读1分钟

冒泡排序:
就像冒泡一样,每次都可以选出一个最大的值到顶部,这里是数组的最后面的值,所以用两层循环。
第一层是冒泡次数,应该是arr.length-1,因为已经在顶部的不需要冒泡。
第二层则是冒泡过程,每一次冒泡之后,待排序的元素都会减少1,第几次冒泡就是减少i个元素,所以第二次相当于在0到arr.length-i-1里冒泡。 这里也可以用递归,只需要改一下函数,加一个参数,比如bubbleSort(arr,n);第一次是数组长度,然后一次次减少,一直到1。

function bubbleSort(arr) {
    for (let i = 0; i < arr.length - 1; i++) {
        let flag = 0;
        for (let j = 0; j < arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
                flag = 1;
            }
        }
        if (flag === 0) {
            return;
        }
    }
}

选择排序:


function chooseSort(arr) {
    if (arr.length < 2) {
        return arr;
    }
    for (let i = 0; i < arr.length - 1; i++) {
        let min = i;
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        
        [arr[i], arr[min]] = [arr[min], arr[i]];
        
    }
}

插入排序:
把数组分为两组,一组已排序,一组待排序,每次从未排序的数组里找到一个元素插入到已排序数组里。待插入元素从后往前比较,如果比前面的小,那么就前面的往后挪一格,一直到不满足,然后插入到不满足的元素的后面。 第一个元素默认称为已排序数组,之后的元素就是待排序数组。

image.png

function insertSort(arr){
    for(let i=1;i<arr.length;i++){
       let j;
       const temp=arr[i];//待排序元素
       for(j=i-1;j>=0;j--){ //已排序数组
            //  从后往前,如果待排序元素小于数组元素,则数组元素后移
           if(temp<arr[j]){
               arr[j+1]=arr[j];
           }
           else {
               break;
           }
       }
       arr[j+1]=temp;
    }
}

希尔排序:
取序列长度的一半(向下取整)作为增量gap,对序列进行分组,然后对各组进行“直接插入排序”。 增量gap依次减半(向下取整),重复上面的分组排序操作,最终一个的增量step为1。
是插入排序的优化,因为插入排序如果待排序的数组要到已排序数组的最前面,那么这里就需要很多次移动,比如[23,234,54,46,543,435,4543,5,4,5,325,2],这里2要穿越很远,移动次数很多。原因是这个数组不够均匀,希尔排序让数组更均匀之后再进行插入排序,那么这样就会更快,移动次数更少。
这里用3层循环,step是他们的间隔,一直到间隔为1结束。 总的来说还是从后往前排序,每个元素,对自己的分组排在前面的进行插入排序。 当step=1的时候其实就是一个对整个数组的插入排序

function shellSort(arr){
    for(let step=Math.floor(arr.length/2);step>0;step=Math.floor(step/2)){
        for(let i=step;i<arr.length;i++){
            const temp=arr[i];//待排序元素,插入排序,但是是间隔地插入排序
            let j=i;
            for(j=i-step;j>=0;j-=step){
                if(arr[j]<temp){
                    break;
                }
                arr[j+step]=arr[j];
            }
            arr[j+step]=temp;
        }
    }
}