算法:就是解決問題的方法和步驟,算法和相關(guān)的計(jì)算機(jī)語(yǔ)言無(wú)關(guān)
-
使用find:線型查找
遞歸代碼:
<script type="text/javascript">
function jiecheng(n){
if( n == 1){
return 1;
}
return n * jiecheng(n-1);
}
alert(jiecheng(4));
</script>
數(shù)組:
1:后面加一個(gè)數(shù):arr.push()
2:后面刪除一個(gè)數(shù):arr.pop()
3:前面加一個(gè)數(shù):arr.unshift()
4:前面刪除一個(gè)數(shù):arr.shift(); //刪除后返回的值是:number
5:刪除:arr.splice('位置',刪除幾個(gè));//刪除后返回值是:objert
-
find2:二分查找
find2:也叫分治法可以解決大多數(shù)算法問題恩尾。 1:數(shù)組必須是有序的數(shù)組 2:必須知道怎么找中間數(shù)(取中間數(shù)的時(shí)候是偏左饶反颉)取中間值:Math.floor((s+e)/2); 3:要知道起始位置和結(jié)束范圍
二分查找代碼:
//在數(shù)組里找重復(fù)
function findInArray(n,arr){
for(var i = 0; i <arr.length; i++){
if(arr[i] == n){
return true;
}
}
return false;
}
function removeDup(arr,s,e){
if(s>e){
return [];
}
else if(s==e){
return[arr[s]];
}
var c = Math.floor((s+e)/2);
var left = removeDup(arr,s,c);
var right = removeDup(arr,c+1,e);
for(var i = 0; i < right.length; i++ ){
if(!findInArray(right[i],left)){
left.push(right[i]);
}
}
return left;
}
var arr = [28,18,35,64,18,35,64,80];
//document.write(removeDup(arr,0,arr.length-1));
document.write(removeDup(arr,0,arr.length-1));
(1):找最小值:首先要一分為二,left值=遞歸后左邊最小鹅很,right值=遞歸后右邊最小 ,最后比較left和right的返回值
在數(shù)組里找最小值的代碼:
function findMin(arr,s,e){
if(s>e){
return false;
}
else if(s==e){
return arr[s];
}
var c = Math.floor((s+e)/2);
var left = findMin(arr,s,c);
var right = findMin(arr,c+1,e);
if(left < right){
return left;
}
else{
return right;
}
};
var arr = [28,-90,-100,50,60,100,700];
alert(findMin(arr,0,arr.length-1));
(2):數(shù)組去重:首先要一分為二煞肾,left遞歸后去重復(fù)咧织,right遞歸后去重,循環(huán)right籍救。如果不在left里,就加到left渠抹,然后返回left蝙昙。
去重復(fù)代碼:
function findInArray(n,arr){
for(var i=0; i<arr.length; i++){
if(arr[i] == n){
return true;
}
}
return false;
};
function removeDup(arr,s,e){
if(s>e){
return [];
}
else if(s == e){
return [arr[s]];
}
var c= Math.floor((s+e)/2);
var left = removeDup(arr,s,c);
var right = removeDup(arr,c+1,e);
for(var i =0; i<right.length;i++){
if(!findInArray(right[i],left)){
left.push(right[i]);
}
}
return left;
};
var arr = [28,19,48,29,-40,48,100];
document.write(removeDup(arr,0,arr.length-1));
2:選擇排序:(插入排序):從剩余的數(shù)據(jù)中,找嘴角的放到前面梧却,并交換當(dāng)前位置
選擇排序代碼:
function selectionSort(arr){
for(var i=0; i<arr.length; i++){
for(var j=i+1; j<arr.length; j++){
if(arr[i]>arr[j]){
var tmp = arr[j];
arr[j] = arr[i];
arr[i] =tmp;
}
}
}
return arr;
};
var arr = [-105,67,78,95,28,46];
document.write(selectionSort(arr));
3:歸并排序:分治法或者二分法思路左面排序自己奇颠,右邊排序自己,每一比較左右數(shù)組的第一個(gè)值放航,比較后的最小值放到新的數(shù)組里烈拒。
歸并排序代碼:
function mergesSort(arr,s,e){
//判斷相等的時(shí)候
if(s>e){
return [];
}else if( s==e){
return [arr[s]];
}
//從中間切開
var c = Math.floor((s+e)/2);
var left = mergesSort(arr,s,c);
var right = mergesSort(arr,c+1,e);
var result = [];
while(left.length || right.length){
if(left[0]>right[0]){
result.push(right.shift());
}else{
result.push(left.shift());
}
if(left.length == 0){
result = result.concat(right);
break;
}else if(right.length == 0){
result = result.concat(left);
break;
}
}
return result;
}
var arr = [-105,28,29,30,29,28,45,30];
document.write(mergesSort(arr,0,arr.length-1));
4:快速排序:分治法思路,找到中間位置广鳍,準(zhǔn)備兩個(gè)空數(shù)組分別方左右的值荆几,遞歸后調(diào)用,鏈接數(shù)組c=arr.splice(cIndex,1),c[0]是中間的數(shù)組赊时。
快速排序代碼:
function quickSort(arr,s,e){
//判斷是否相等
if(arr.length == 0 ){
return [];
}
var cIndex = Math.floor((s+e)/2);
var c = arr.splice(cIndex,1);
var left = [];
var right = [];
for(var i=0; i<arr.length; i++){
if(arr[i]<c[0]){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
//遞歸返回
return quickSort(left).concat(c,quickSort(right));
}
var arr = [-105,29,30,45,16,57];
document.write(quickSort(arr));
數(shù)據(jù)結(jié)構(gòu):算法離不開數(shù)據(jù)結(jié)構(gòu)吨铸,算法沒有最好的算法,只有最合適的算法(有序數(shù)組--是數(shù)據(jù)結(jié)構(gòu) 無(wú)序數(shù)組--是數(shù)據(jù)結(jié)構(gòu))
衡量算法的好壞兩個(gè)指標(biāo):
1祖秒,時(shí)間(時(shí)間復(fù)雜度用O表示)
2诞吱,空間(空間復(fù)雜度S表示)
1:二叉樹:
2:散列:也叫(哈希--hash)是指數(shù)組 存數(shù)據(jù)時(shí)使用下標(biāo)
分析不同的數(shù)據(jù)結(jié)構(gòu)是指:1,增加 2修改 3刪除 4查詢
數(shù)據(jù)不重復(fù):(測(cè)試以毫秒為單位的運(yùn)算速度)
增加: 查詢: 綜合
無(wú)序數(shù)組: 50 39 85
有序數(shù)組: 5000 5 5100
二叉樹: 25 12 35
散列: 10 10 20