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);