js實現排序算法

1.冒泡排序

 比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。對每一對相鄰元素作一樣的工做,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對全部的元素重複以上的步驟,除了最後一個。持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。javascript

 代碼以下:java

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

運行結果shell

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

        }

運行結果:spa

3.插入排序

 即構建有序序列,未排序數據依次從已排序數據按從後往前比較,插入到合適的位置。代碼以下:3d

  

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

		}

 運行結果以下:code

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]blog

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

 運行結果

  

相關文章
相關標籤/搜索