js基本排序算法(递增)

相关链接:视觉算法——以动态图的方式来展示算法的实现过程

1.冒泡排序

原理:先找出当前数组中最大的那个放到最后
步骤: 比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个 数据交换。
这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
N=N-1,如果N不为0就重复前面二步,否则排序完成。

   function bubbleSort(arr) {
            for (var i = 0; i < arr.length - 1; i++) {
                for (var j = 0; j < arr.length - i - 1; j++) {
                    if (arr[j] > arr[j + 1]) {
                        var temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            return arr;
        }
        console.log(bubbleSort([6, 1, 2, 4, 3, 5]))  //1,2,3,4,5,6

2. 选择排序

原理:每次循环选出最小的放在前面
步骤:在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换……第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。

 function selectSort(arr) {
            var min, temp;
            for (var i = 0; i < arr.length - 1; i++) {
                min = i;
                for (var j = i + 1; j < arr.length; j++) {
                    if (arr[j] < arr[min]) {
                        min = j;
                    }
                }
                temp = arr[i];
                arr[i] = arr[min];
                arr[min] = temp;
            }
            return arr;
        }
        console.log(selectSort([6, 1, 2, 4, 3, 5])) //1,2,3,4,5,6

3. 快速排序

原理:就是一开始选择当前数组的中中间,比中间的数的大的放到右边的数组,比它小的放到左边,不断递归,直到当前只有一个数
步骤:
1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。

  function quickSort(arr) {
            if (arr.length < 2) { return arr }

            var left = [], right = [], mid = arr.splice(Math.floor(arr.length / 2), 1);

            for (var i = 0; i < arr.length; i++) {
                if (arr[i] < mid) {
                    left.push(arr[i]);
                } else {
                    right.push(arr[i])
                }
            }
            return quickSort(left).concat(mid, quickSort(right))
        }
        console.log(quickSort([6, 1, 2, 4, 3, 5])) //1,2,3,4,5,6

4. 插入排序

原理:

  1. 选择一个数与这个数前面的数就行比较,开始时选择序号为1的,以后循环依次往后选
  2. 然后将选择的数与前面的数进行比较,比前面的数小,就交换两者位置
  3. 继续向前找,直到找到第一个比选择的数小的,就把选择的这个数放到那个较小数的后一位,然后依次类推的进行1,2,3的步骤
 function insertSort(arr) {
                var len = arr.length;
                for (var i = 1; i < len; i++) {
                    var key = arr[i];
                    var j = i - 1;
                    while (j >= 0 && arr[j] > key) {
                        arr[j + 1] = arr[j];
                        j--;
                    }
                    arr[j + 1] = key;
                }
                return arr;
            }
         console.log(insertSort([1,2,5,19,3]))   //1,2,3,5,19

5. 数组的sort方法

 // 1.如果调用该方法时没有使用参数,使用ascii码进行对比
        var arr = ['General','Tom','Tam','John','Army'];
		var resArr = arr.sort();
		console.log(resArr);//输出   ["Army", "General", "John", "Tam", "Tom"]
        var arr2 = [30, 10, 111, 35, 1899, 50, 45];
        var resArr2 = arr2.sort();
        console.log(resArr2);//输出  [10, 111, 1899, 30, 35, 45, 50]

        // 如果想按照其他规则进行排序,就需要提供比较函数,该函数要比较两个值
        // 2.a-b 升序
        var arr3 = [30,10,111,35,1899,50,45];
		arr3.sort(function(a,b){
			return a - b;
		})
        console.log(arr3);//输出  [10, 30, 35, 45, 50, 111, 1899]
        
        // 3.b-a 降序
        var arr4 = [30,10,111,35,1899,50,45];
		arr4.sort(function(a,b){
			return b - a;
		})
		console.log(arr4);//输出 [1899, 111, 50, 45, 35, 30, 10]

        // 4.根据数组中的对象的某个属性值排序
		var arr5 = [{id:10},{id:5},{id:6},{id:9},{id:2},{id:3}];
		arr5.sort(function(a,b){
			return a.id - b.id
		})
		console.log(arr5);
		//输出新的排序
		//		{id: 2}
		//		{id: 3}
		//		{id: 5}
		//		{id: 6}
		//		{id: 9}
        //		{id: 10}
        

        // 4.根据数组中的对象的多个属性值排序,多条件排序;
        var arr6 = [{id:10,age:2},{id:5,age:4},{id:6,age:10},{id:9,age:6},{id:2,age:8},{id:10,age:9}];
		arr6.sort(function(a,b){
			if(a.id === b.id){//如果id相同,按照age的降序
				return b.age - a.age
			}else{
				return a.id - b.id //不同时,按id进行升序排序
			}
		})
		console.log(arr6);
		//输出新的排序
		//		{id: 2, age: 8}
		//		{id: 5, age: 4}
		//		{id: 6, age: 10}
		//		{id: 9, age: 6}
		//		{id: 10, age: 9}
		//		{id: 10, age: 2}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值