算法:就是解決問題的方法和步驟,算法和相關的計算機語言無關
-
使用find:線型查找
遞歸代碼:
<script type="text/javascript">
function jiecheng(n){
if( n == 1){
return 1;
}
return n * jiecheng(n-1);
}
alert(jiecheng(4));
</script>
數組:
1:后面加一個數:arr.push()
2:后面刪除一個數:arr.pop()
3:前面加一個數:arr.unshift()
4:前面刪除一個數:arr.shift(); //刪除后返回的值是:number
5:刪除:arr.splice('位置',刪除幾個);//刪除后返回值是:objert
-
find2:二分查找
find2:也叫分治法可以解決大多數算法問題。 1:數組必須是有序的數組 2:必須知道怎么找中間數(取中間數的時候是偏左取)取中間值:Math.floor((s+e)/2); 3:要知道起始位置和結束范圍
二分查找代碼:
//在數組里找重復
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的返回值
在數組里找最小值的代碼:
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):數組去重:首先要一分為二,left遞歸后去重復,right遞歸后去重,循環right。如果不在left里,就加到left,然后返回left。
去重復代碼:
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:選擇排序:(插入排序):從剩余的數據中,找嘴角的放到前面,并交換當前位置
選擇排序代碼:
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:歸并排序:分治法或者二分法思路左面排序自己,右邊排序自己,每一比較左右數組的第一個值,比較后的最小值放到新的數組里。
歸并排序代碼:
function mergesSort(arr,s,e){
//判斷相等的時候
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:快速排序:分治法思路,找到中間位置,準備兩個空數組分別方左右的值,遞歸后調用,鏈接數組c=arr.splice(cIndex,1),c[0]是中間的數組。
快速排序代碼:
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));
數據結構:算法離不開數據結構,算法沒有最好的算法,只有最合適的算法(有序數組--是數據結構 無序數組--是數據結構)
衡量算法的好壞兩個指標:
1,時間(時間復雜度用O表示)
2,空間(空間復雜度S表示)
1:二叉樹:
2:散列:也叫(哈希--hash)是指數組 存數據時使用下標
分析不同的數據結構是指:1,增加 2修改 3刪除 4查詢
數據不重復:(測試以毫秒為單位的運算速度)
增加: 查詢: 綜合
無序數組: 50 39 85
有序數組: 5000 5 5100
二叉樹: 25 12 35
散列: 10 10 20