JS算法之数组重组与快速排序

JS的算法题

数组去重

function clearArray(arr){
    
    
    new clearArray=new Array;
    for(var i;i<arr.length;i++){
    
    
        if(clearArray.indexOf('arr[i]')==-1)//如果没有匹配元素则添加,也可以用来除重
            clearArray.push(arr[i]);
    }
}

利用indexOf匹配进行去重,用indexof来判断数组中是否已有重复元素来添加

快速排序算法

假设有一串数组

4 1 3 5 7 2 8 9
i j

我们取数组的第一个元素为基值(即4),设置2个哨兵(指针)分别指向数组的第一个元素与最后一个元素,

每个哨兵带着基值以此跟数组中相应位置的元素比较(j比i先行),哨兵j先跟9比较,比基值大则j=j-1,直到找到一个小于等于基值的数,此时j暂时停止移动,然后i开始比较,i从左往右进行比较,当遇到一个比基值大的数时候停止移动

4 1 3 5 7 2 8 9
i j

则第一次i,j都停止时,i是在5的位置,j是在2的位置,然后将i,j对应的值互换

4 1 3 2 7 5 8 9
i j

互换值之后j依旧先开始移动,从当前位置接着往下一位比较,重复之前的操作直到i,j相遇

4 1 3 2 7 5 8 9
i,j

当j也移动到2时,i,j相遇,此时停止移动,交换相遇位置的值(即i,j对应的值2)与基值

2 1 3 4 7 5 8 9
i,j

这时我们可以发现,哨兵左边的值都比4要小,右边的值都比4要大,然后以4为分割线,拆分为2个数组

2 1 3 4
7 5 8 9

对拆分完后的数组继续进行快序排序,直到序列只有一个的时候。

用JS实现

function quicksort(arr,rear,front){
    
    
    var i,j,key;//哨兵,基值
    i=rear;
    j=front;
    key=arr[rear];
    if(rear>=front)
        return 0;
    while(i<j){
    
    //i比j要小
        while(arr[j]>key&&i<j){
    
    //j先判断
            j--;
        }
        while(arr[i]<=key&&i<j){
    
    //j停止后,i开始判断
            i++;
        }
        if(i<j){
    
    
            var b;//i,j都停止了
            b=arr[i];
            arr[i]=arr[j];
            arr[j]=b;//交互i,j的值
        }
    }//ij相遇
    arr[rear]=arr[i]//相遇点的值与基值交换
    arr[i]=key;
    quicksort(arr,rear,i-1);//前半部分重复快速排序
    quicksort(arr,i+1,front);//后半部分重复快速排序
}

// var arr = [3,3,-5,6,0,2,-1,-1,3];
// console.log(arr);
// quicksort(arr,0,arr.length-1);
// console.log(arr);

猜你喜欢

转载自blog.csdn.net/qq_51649346/article/details/124115059