博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

算法

Posted on 2016-11-02 20:27  XWZ1025  阅读(112)  评论(0编辑  收藏  举报

7种算法  3种数组方法  声明变量提升 &&和||的回顾

1.冒泡排序

2.sort方法

3.选择排序

4.递归算法  函数内部自己调用自己就是递归算法  但是得设定一个结束  不然会陷入死循环

5.快速排序 可以无序找一个值作为参考值  相比较 建立两个空数组  比参考值小的放在左边  比参考值大的放在右边  左右边两边再进行这种操作 利用了递归 不断调用自己得到这种效果

6.贪心算法 

7.折半查找 必须是有序的 对半取值和选取的值进行对比 缩小区间找出这个数

声明变量的提升:任何声明变量和声明函数都会被提升到当前函数顶部

&& 且 两者假取前者假  两真取前者真

|| 或 取最先出现的非0得数  两假取后者假

 

 

 

 

具体代码

//算法:解决问题的方案;解决问题的一系列清晰的指令

//特性1.时间有穷性

//   2.答案唯一性

//1.冒泡排序

var arr = [5,3,7,8,4];

for (var i = 0; i < arr.length-1; i++) {

for (var j = 0; j < arr.length-i-1; j++) {

if (arr[j] > arr[j+1]) {

var temp = arr[j+1];

arr[j+1] = arr[j];

arr[j] = temp;

}

}

}

console.log(arr);

//冒泡排序总共需要排序n-1趟,每趟比较n-1-趟数这么多次;每趟排序可能交换多次元素,找到其中一个元素的最终位置每次比较都是相邻元素之间的大小比较

//2.sort 方法:js数组的一个方法

var arr = [1,10,2,35,35,0,49];

//第一种

//要求按照数字的从小到大排序

// arr.sort();

// console.log(arr);

// arr.sort(function(obj1,obj2){

// if (Number(obj1) > Number(obj2)) {

// return 1;  //desc

// }else if(Number(obj1) < Number(obj2)){

// return -1;  //asc

// }else{

// return 0;  //same

// }

// });

// console.log(arr);

//第二种

arr.sort(function(obj1,obj2){

return obj2 - obj1;

});

console.log(arr);

//选择排序

// var arr = [0,3,4,5,15,23,5,43,34]

// //比较n-1趟

// for (var i = 0;i < arr.length - 1; i++) {

// //假定第一个元素是最大值

// var max = 0;

// //找到了某一趟的最大值

// for (var j = 1; j < arr.length - i;j++ ) {

// if (arr[max] < arr[j]) {

// max = j;

// }

// }

// //放到合适的位置

// if (max != arr.length - i -1){

// //交换这两个位置的元素

// var temp = arr[max];

// arr[max] = arr[arr.length - i -1];

// arr[arr.length - i -1] = temp;

// }

// }

// console.log(arr);

//

// for循环 n-1趟{

// 假设下标为0最大 max = 0

// 循环  比较假定的最大数据后面的数字的大小{

// 记录这趟的最大值

// }

// 查看是否需要交换(数组长度 - 趟数 - 1)

// }

//4.递归算法

//递归跟函数分不开,函数内部自己调用自己,就叫递归

// function fun(){

// console.log(11);

// fun();

// }

// fun();

//递归必须有一个出口

// var num = 0;

// function fun(){

// num++;

// console.log(num);

// if (num > 100) {

// return;

// }

// fun();

// }

// fun();

//求n!  递归也是一个算法

//规定0! = 1; 求一个数的阶乘

// function calculate(n){

// if (n == 0) {

// return 1;

// }

// return n * calculate(n-1);

// }

// var result = calculate(5);

// console.log(result);

//5.快速排序

//基数

//

// var arr = [4,1,6,2,3,10,9,0,19]

// //快速排序的函数

// function quickSort(oldArray){

// if (oldArray.length <= 1) {

// return oldArray;

// }

// //取出一个基数

// //那个基数的下标

// var privosIndex = Math.floor(oldArray.length / 2);

// //这个基数需要从数组里面剔除出来

// var privos = oldArray.splice(privosIndex,1)[0]; //splice返回的是一个数组

// var left = [];

// var right = [];

// for (var i = 0; i < oldArray.length;i++) {

// if (oldArray[i] < privos) {

// left.push(oldArray[i]);

// }else{

// right.push(oldArray[i]);

// }

// }

// return quickSort(left).concat(privos,quickSort(right));

//

// }

// var result = quickSort(arr);

// console.log(result);

//quickSort()---数组排序

//6.贪心算法(有缺陷)

//20美元  10美元  5美元  1美元

//如何用最少数量的纸币凑成96美元.

//var num1 = parseInt(96 / 20);

//var num2  =parseInt((96 - num1 *20) / 10) ;

//var num3 = parseInt((96 - num1 * 20 - num2 * 10) / 5);

//var num4 = (96 - num1 * 20 - num2 * 10 - num3 * 5) / 1;

//7.折半查找

//折半查找:不是排序算符,是查找方法,能够进行折半查找的前提是这个数组是有序的

var arr = [1,2,4,5,8,10,30,44,66,76];

//需求查看数字30 在arr中的下标是多少

//indexOf()

// function SWNIndexof(arr,num){

// for (var i = 0;i < arr.length;i++) {

// if (arr[i] == num) {

// return i;

// }

// }

// return -1;

// }

// var result = SWNIndexof(arr,30);

// console.log(result);

//折半查找

var min = 0;

var max = arr.length - 1;

for (var i = 0; i < arr.length / 2; i++) {

mid = parseInt((min + max) / 2);

if (arr[mid] > 30) {

max = mid;

}else if(arr[mid] < 30){

min = mid + 1;

}else{

console.log(mid);

break;

}

}