1. 程式人生 > >講述js演算法中的排序、陣列去重

講述js演算法中的排序、陣列去重

其實在js中實現陣列排序,採用陣列中sort方法實現還是比較簡單的:

一 排序

簡單實現陣列排序

var arr = [];
for(var i=0;i<20;i++){
	arr.push(Math.floor(Math.random()*100))
}
arr.sort(function(a,b){
	return a>b?1:-1;
})
alert(arr)



不能簡單使用sort方法,預設情況下 sort方法是按ascii字母順序排序的,而非我們認為是按數字大小排序,

sort() 方法可以接受一個 方法為引數 ,這個方法有兩個引數。分別代表每次排序比較時的兩個陣列項。sort()排序時每次比較兩個陣列項都回執行這個引數,並把兩個比較的陣列

項作為引數傳遞給這個函式。當函式返回值為1的時候就交換兩個陣列項的順序,否則就不交換。

演算法的陣列排序

var arr = [];
for(var i=0;i<20;i++){
	arr.push(Math.floor(Math.random()*100))
}
//生成一個無序的arr陣列
function sort(arr,start,end){
	//陣列長度為1
	if(start == end ){
		return [arr[start]]
	}else if(start == end-1){
		//陣列長度為2,根據數值大小 來排序
		if(arr[start]>arr[end]){
			return [arr[end],arr[start]]
		}else{
			return [arr[start],arr[end]]
		}
	}
	// 陣列長度一半
	var l = Math.floor((start+end)/2);
	//左邊陣列
	var arrLeft = sort(arr, start,l);
	//右邊陣列
	var arrRight = sort(arr,l+1,end);
	//返回結果
	var result = [];
	//分割成兩部分 左右兩個陣列 只比對陣列中的第一個數,那個數值小就把誰放到結果裡面,並把小的數值刪除掉,固採用陣列中的shift方法。一旦出現左邊陣列或右邊陣列,沒有資料的時候
	//result陣列就與還有資料的數組合並 採用 concat,並返回結果
	while(arrLeft.length>0 || arrRight.length>0){
		if(arrLeft.length==0){
			result = result.concat(arrRight);
			break;
		}else if(arrRight.length==0){
			result = result.concat(arrLeft);
			break;
		}
		if(arrLeft[0]<arrRight[0]){
			result.push(arrLeft.shift())
		}else{
			result.push(arrRight.shift());
		}
	}
	return result;
}
var arrSort = sort(arr,0,arr.length-1);//引數 陣列,開始位置,結束位置

document.write(arr+'<br/>'+arrSort);

講解:陣列排序主要是採用將陣列一拆為二,直到不能為之,最後只能是拆掉數組裡面只能是一個或者是兩個,因為陣列的長度有奇數偶數之分,拆到最後 數組裡面只有一個或者兩個之後 開始排序並返回結果,並將這些結果在一一比對 進行合併。這個方法 可能大家覺得 為什麼要這麼複雜,一直採用第一種不行嗎,其實當然可以啦,但是這個世界上還有效能這個詞彙,當資料之後幾個 幾十個 幾個百 ,大家的算出的結果時間是沒有什麼區別的 ,如果當資料龐大的幾億 幾十億 我們還有這種自信用第一種方法嗎,其實js的演算法就是分而治之,將很多問題劃分成小的來解決。

二、陣列去掉重複

簡單方法去掉重複:先宣告一個空的陣列,將重複的陣列 for 迴圈插入,重複的跳過 不重複的插入

var arr = [];
for(var i=0;i<20;i++){
	arr.push(parseInt(Math.random()*10));
}
Array.prototype.indexOf = function(n){
	for(var i=0;i<this.length;i++){
		if(this[i] == n){
			return i;
		}
	}
	return -1;
}
function removeDup(arr){
	var result = [];
	for(var i=0;i<arr.length;i++){
		if(result.indexOf(arr[i]) == -1){

			result.push(arr[i]);
		}
	}
	return result; 
}
var arr2 = removeDup(arr)
document.write(arr+'<br/>'+arr2)


演算法陣列去掉重複

var arr = [];
for(var i=0;i<20;i++){
	arr.push(parseInt(Math.random()*10));
}
Array.prototype.indexOf = function(n){
	for(var i=0;i<this.length;i++){
		if(this[i] == n){
			return i;
		}
	}
	return -1;
}
function removeDup(arr,s,e){
	if(s==e){
		//分割就剩下一個
		return [arr[s]]
	}else if(s==e-1){
		//為了優化 剩下兩個就不用分割啦
		if(arr[s]==arr[e]){
			return [arr[s]]
		}else{
			return [arr[s],arr[e]];
		}
	}
	//陣列平分成兩段,
	var l = Math.floor((s+e)/2);
	//左邊
	var arrL = removeDup(arr,s,l);
	//右邊
	var arrR = removeDup(arr,l+1,e);
	//結果 先把左邊的複製進去
	var result = arrL;
	//迴圈 將不重複的資料插入到結果裡面
	for(var i=0;i<arrR.length;i++){
		if(result.indexOf(arrR[i])== -1 ) result.push(arrR[i])
	}
	return result; //返回結果
}
var arrDup = removeDup(arr, 0, arr.length-1);
document.write(arr+'<br/>'+arrDup);
講解:將重複的陣列 切割,拆分到最後只剩下一個數據或或者兩個陣列,將左邊的資料放到結果裡面,右邊重複的跳過 不重複插入,直到迴圈完,返回結果就可以