去重和排序

数组去重

方法一:

var arr = [1,1,1,2,2,44,55,3,3];
var newArr = [];
for(var i = 0; i < arr.length; i++){
    var cur = arr[i];
    if (newArr.indexOf(cur) === -1) {
        newArr.push(cur);
    }
}
console.log(newArr);

方法二:

function fixArray(arr) {
    var obj = {};
    for (var i = 0; i < arr.length; i++) {
        var cur = arr[i];
        if (obj[cur] == cur) {
            arr[i] = arr[arr.length - 1];
            arr.pop();
            i--;
            continue
        }
        obj[cur] = cur;
    }
    return arr
}
var arr = [1, 2, 3, 4, 56, 3, 2, 1, 1, 2, 3];
fixArray(arr);

方法三:ES5与ES6,ES7等方法

array.filter(function(item,index,ary){
    return ary.indexOf(item)===index;
})
以上所有的方法都无法处理NaN的问题,前两种无法去重,后一种直接删掉了NaN
或者
[...new Set([array])];//可以处理NaN问题

方法四:可以去重数组中基本数据类型的值

function noRepeat(arr){
    let ary=[],obj={};
    for(let i=0,len=arr.length;i<len;i++){
        if(!(obj[arr[i]+typeof arr[i]])){
            ary.push(arr[i]);
            obj[arr[i]+typeof arr[i]]=1;
        }
    }
    return ary;
}

其他方法:字符串去重并记录重复数目

function unique(string){
let n=0,str='';//n记录重复的个数,str新的字符串
for(let i=0;i<string.length;i++){
	if(string[i]==str[str.length-1]){
		n++;
	}else{
		if(n>0){
			str+=n+1;
			n=0;
		}
		str+=string[i];
	}
	return str;
    }
}

冒泡排序

当前项和后一项进行比较,如果当前项大于后一项就交换位置

function bubbleSort(arr) {
    var flag = false;
    // 控制比较轮数
    for (var i = 0; i < arr.length - 1; i++) {
        flag = false;
        // 控制比较次数
        for (var j = 0; j < arr.length - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                arr[j] = arr[j] + arr[j + 1];
                arr[j + 1] = arr[j] - arr[j + 1];
                arr[j] = arr[j] - arr[j + 1];
                flag = true;
            }
        }
        if (!flag) {
            return arr;
        }
    }
};

var arr = [5, 65146, 56, 95, 112, 1, 69, 854, 8, 77, 438];
console.log(bubbleSort(arr));

快速排序

var ary=[98,88,16,4,33,28];

思路:

  1. 求出中间值的索引;
  2. 通过索引找到中间值;4;
  3. 创建两个数组:left; right;
  4. 遍历数组中的每一项,让每一项跟4中间值进行比较;比他大的,放右边,比他小的放左边;
  5. left.concat(16,right)
  6. --函数自己调用自己;--递归
  7. 停止拆分的条件:当数组的长度<=1的时候;直接返回数组
function quickSort(ary) {
    //停止拆分的条件;-如果满足停止拆分,阻断后续代码的执行
    if (ary.length <= 1) {
        return ary;//return:1)返回值 2)阻断程序执行;
    }
    //1.求出中间值的索引;
    var point = Math.floor(ary.length / 2);
    //2.通过索引找到中间值;4;
    var pointValue = ary.splice(point, 1)[0];
    //3.创建两个数组:left=[]; right=[]
    var left = [];
    var right = [];
    //4.遍历数组中的每一项,让每一项跟16中间值进行比较;比他大的,放右边,比他小的放左边;
    for (var i = 0; i < ary.length; i++) {
        ary[i] > pointValue ? right.push(ary[i]) : left.push(ary[i]);
    }
    return quickSort(left).concat(pointValue, quickSort(right));
}
var arr = [5, 65146, 56, 95, 112, 1, 69, 854, 8, 77, 438];
console.log(quickSort(arr));

插入排序

var ary=[98,88,16,4,33,28];

思路:

  1. 先拎出一个数组; ary.splice(0,1)=>[98]
  2. 遍历ary数组中的每一项;分别跟[4,16,28,88,98]数组进行比较:

插排的核心:拿ary数组中的每一项,跟left数组从后往前的比较,比他小,继续往前比较,比他大,放到他下一项的前面。

function insertSort(ary) {
    //1.先拎出一个数组;
    var left = ary.splice(0, 1);
    //2.拿ary数组中的每一项,跟left数组从后往前的比较,比他小,继续往前比较,比他大,放到他下一项的前面;
    for (var i = 0; i < ary.length; i++) {
        var cur = ary[i];
        for (var j = left.length - 1; j >= 0;) {
            if (cur < left[j]) {
                j--;
                //判断比到头了
                if (j == -1) {
                    left.unshift(cur);
                }
            } else {
                left.splice(j + 1, 0, cur);
                break;
            }
        }
    }
    return left;
}
var arr = [5, 65146, 56, 95, 112, 1, 69, 854, 8, 77, 438];
console.log(insertSort(arr));
原文地址:https://www.cnblogs.com/Juphy/p/6959189.html