• js实现排序算法


    1.冒泡排序

     比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

     代码如下:

    var arr = [5,4,8,1,3,7,0,9,2,6];
    var len = arr.length;
    var tmp = null;
    for(var j=0; j<len-1; j++){		//循环9次
        for(var i=0; i<len-1-j; i++){	//每次比较10-j-1次数
    	if(arr[i]>arr[i+1]){
    		tmp = arr[i+1];
    		arr[i+1] = arr[i];
    		arr[i] = tmp;
    	}
        }  console.log('第'+(j+1)+'次循环',arr);
    }

    运行结果

    2.选择排序

     依次找到剩余元素最小值,放置排好序的末尾(第一个放在开头)。代码如下:

    var arr = [5,4,8,1,3,7,0,9,2,6];
            var len = arr.length;
            var min = null;
            var tmp = null;
            //选择排序
            for(var j=0; j<len-1 ; j++){
                min = j;
                for(var i=j+1; i<len ;i++){
                    if(arr[i] < arr[min]){
                        min = i;
                    }
                }
                tmp = arr[j]
                arr[j] = arr[min];
                arr[min] = tmp;
    
                console.log('第'+(j+1)+'次循环', arr);
    
            }

    运行结果:

    3.插入排序

     即构建有序序列,未排序数据依次从已排序数据按从后往前比较,插入到合适的位置。代码如下:

      

    var arr = [5,4,8,1,3,7,0,9,2,6];
    		var len = arr.length;
    		var cur = null;
    		var tmp = null;
    
    		//插入排序
    		for(var j=1; j<len ; j++){		//从第二个开始比较
    			cur = j-1;
    			tmp = arr[j];			//带插入元素
    			while (cur >= 0 && arr[cur] > tmp) {
    				arr[cur+1] = arr[cur];
    				cur--;
    			}
    			arr[cur+1] = tmp;
    			
    
    			console.log('第'+(j)+'次循环', arr);
    
    		}
    

     运行结果如下:

    4.希尔排序

    var arr = [5,4,8,1,3,7,0,9,2,6];
    
            function shellSort(arr) {
    
                var len = arr.length;
                var tmp = undefined;
                var gap = Math.floor(len/2);
    
                while(gap >= 1) {
                    for(var i=0; i<len; i++){
                        for(var j=i; j>=gap; j=j-gap){
                            if(arr[j] < arr[j-gap]){
                                tmp = arr[j];
                                arr[j] = arr[j-gap];
                                arr[j-gap] = tmp;
                            }
                        }
                    }
                    gap = Math.floor(gap / 2);
                }
    
                console.log(arr);
                return arr;
            }
    
            shellSort(arr);

    运行结果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    5.快速排序

     从将待排序列找出一个基准值,通过比较大小分为两个序列,递归查找直到leng的长度小于2. 用递归方法,如下

    var arr = [5,4,8,1,3,7,0,9,2,6];
            var len = arr.length;
            var qsort = function(arr){
                var len = arr.length;
                if (len < 2) return arr;
                var basic = arr[0];            //默认第一个为基准数
                var left = [];
                var right = [];
                
                for(var j=1; j<len ; j++){
                    if(arr[j] < basic){
                        left.push(arr[j]);
                    }else {
                        right.push(arr[j]);
                    }
    
                }
    
                return qsort(left).concat(basic, qsort(right))
            }

    运行结果

      

    6.归并排序

     把序列分成两个长度为n/2的子序列,对这两个子序列分别归并排序(循环将两个数组的第一个值比较,并弹出第一个值, 直到数组长度都不存在),将两个排序好的子序列合并成一个最终的排序序列

    var arr = [5,4,8,1,3,7,0,9,2,6];
    		
    		var merge_sort = function(v){
    			console.log(v);
    			var merge = function(left, right){
    				var final = [];
    				while(left.length && right.length) {		//两个数组的第一个值比较,并删除第一个值
    					final.push(left[0] <= right[0] ? left.shift() : right.shift());
    				}
    				console.log(final.concat(left.concat(right)));
    				return final.concat(left.concat(right));
    			}
    
    			//将数组分为2组
    			var len = v.length;
    			if (len< 2) return v;
    			var mid = len / 2;	
    			return merge(merge_sort(v.slice(0, parseInt(mid))), merge_sort(v.slice(parseInt(mid))));
    		}
    		merge_sort(arr);
    

     运行结果

      

     

  • 相关阅读:
    inet_ntoa 的一个小问题
    获取DNS服务器的版本信息
    host_network_interfaces_slow_mode_thresholds
    10月8日至11月底考试安排
    腾讯广点通防作弊
    移动广告作弊方式及防范方式
    广告联盟常用的防作弊手续
    移动端点击作弊与激活作弊的现象与预警
    数据科学家最常用的十种算法(我准备拿这个当成学习参考)
    项目的命名规范,为以后的程序开发中养成良好的行为习惯
  • 原文地址:https://www.cnblogs.com/ihboy/p/9799259.html
Copyright © 2020-2023  润新知