js算法
要求:我有一列 数字要按照从小到大的顺序将他们排好
1.冒泡排序
冒泡思路:把数字拎出来,两个两个之间进行比较,如果发现大的就把他放到后面,这样做就能保证每一次我都能找到最大的一组数字放到最后面
举例说明:要排序数组:int[] arr={6,3,8,2,9,1};
第一趟排序:
第一次排序:6和3比较,6大于3,交换位置: 3 6 8 2 9 1
第二次排序:6和8比较,6小于8,不交换位置:3 6 8 2 9 1
第三次排序:8和2比较,8大于2,交换位置: 3 6 2 8 9 1
第四次排序:8和9比较,8小于9,不交换位置:3 6 2 8 9 1
第五次排序:9和1比较:9大于1,交换位置: 3 6 2 8 1 9
第一趟总共进行了5次比较, 排序结果: 3 6 2 8 1 9
---------------------------------------------------------------------
第二趟排序:
第一次排序:3和6比较,3小于6,不交换位置:3 6 2 8 1 9
第二次排序:6和2比较,6大于2,交换位置: 3 2 6 8 1 9
第三次排序:6和8比较,6大于8,不交换位置:3 2 6 8 1 9
第四次排序:8和1比较,8大于1,交换位置: 3 2 6 1 8 9
第二趟总共进行了4次比较, 排序结果: 3 2 6 1 8 9
---------------------------------------------------------------------
第三趟排序:
第一次排序:3和2比较,3大于2,交换位置: 2 3 6 1 8 9
第二次排序:3和6比较,3小于6,不交换位置:2 3 6 1 8 9
第三次排序:6和1比较,6大于1,交换位置: 2 3 1 6 8 9
第二趟总共进行了3次比较, 排序结果: 2 3 1 6 8 9
---------------------------------------------------------------------
第四趟排序:
第一次排序:2和3比较,2小于3,不交换位置:2 3 1 6 8 9
第二次排序:3和1比较,3大于1,交换位置: 2 1 3 6 8 9
第二趟总共进行了2次比较, 排序结果: 2 1 3 6 8 9
---------------------------------------------------------------------
第五趟排序:
第一次排序:2和1比较,2大于1,交换位置: 1 2 3 6 8 9
第二趟总共进行了1次比较, 排序结果: 1 2 3 6 8 9
---------------------------------------------------------------------
最终结果:1 2 3 6 8 9
---------------------------------------------------------------------
由此可见:N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,i为当前的躺数,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数,
var examplearr=[8,94,15,88,55,76,21,39]; function sortarr(arr){ for(i=0;i<arr.length-1;i++){ for(j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; } sortarr(examplearr); console.log(examplearr);
如何理解内外层循环?
内外层循环的实质是类似于物理当中的控制变量,列如我手上同时有两个变量,这两个变量是会变动的,那么我需要控制其中一个变量不动(外层i),那么i不动以后,我的里层j开始自己变动,当我j完成一次满状态后,我就退出当前的内层循环,进入下一次外层,此时i就从0开始+1,然后重复这一过程,直到我的i外层也满状态,则退出所有循环
2.选择排序
挑选第一个数作为参考目标,然后用其他的数与他比较,挑出最小的数字放前面,之后从第二个数字开始,依次循环
简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数据,将它与arrr[1]交换;第2趟,在待排序数据arr[2]~arr[n]中选出最小的数据,将它与r[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小的数据,将它与r[i]交换,直到全部排序完成。
举例:数组 int[] arr={5,2,8,4,9,1};
-------------------------------------------------------
第一趟排序: 原始数据:5 2 8 4 9 1
最小数据1,把1放在首位,也就是1和5互换位置,
排序结果:1 2 8 4 9 5
-------------------------------------------------------
第二趟排序:
第1以外的数据{2 8 4 9 5}进行比较,2最小,
排序结果:1 2 8 4 9 5
-------------------------------------------------------
第三趟排序:
除1、2以外的数据{8 4 9 5}进行比较,4最小,8和4交换
排序结果:1 2 4 8 9 5
-------------------------------------------------------
第四趟排序:
除第1、2、4以外的其他数据{8 9 5}进行比较,5最小,8和5交换
排序结果:1 2 4 5 9 8
-------------------------------------------------------
第五趟排序:
除第1、2、4、5以外的其他数据{9 8}进行比较,8最小,8和9交换
排序结果:1 2 4 5 8 9
function selectSort(arr){ var len=arr.length; var temp; for(var i=0;i<len-1;i++){ for(var j=i+1;j<len;j++){ if(arr[j]<arr[i]){ temp=arr[j]; arr[j]=arr[i]; arr[i]=temp; } } i++; } return arr; }
3.插入排序
插入排序的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
步骤:
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
<1> 从第一个元素开始,该元素可以认为已经被排序;
<2> 取出下一个元素,在已经排序的元素序列中从后向前扫描;
<3> 如果该元素(已排序)大于新元素,将该元素移到下一位置;
<4> 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
<5> 将新元素插入到该位置后;
<6> 重复步骤2~5。
function insertSort(arr) { for (var i = 1; i < arr.length; i++) { var temp = arr[i]; var j = i - 1; while (j >= 0 && arr[j] > temp) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = temp; } return arr; } var arr = [1, 45, 37, 5, 48, 15, 37, 26, 29, 2, 46, 4, 17, 50, 52]; console.log(insertSort(arr));
开关思想:数组去重
<script>
var arr = [20,25,66,78,25,66,39];//【20,25,66,78,39】
//1.声明一个空数组,存储不重复的元素
var newArr = [];
//2.遍历arr
for(var i = 0;i<arr.length;i++){
//3.检查arr[i]是否在newArr中,如果不在就添加,在就不添加(结果只有两种情况,要么在,要么不在)
var canAdd = true;//假设可以添加
/*遍历newArr,看newArr中是否有元素与arr[i]相等
*/
for(var j = 0;j<newArr.length;j++){//验证开关的状态
if(newArr[j] == arr[i]){
//arr[i]在newArr中,此时不添加
canAdd = false;
break;//只要有重复元素,后面元素没有比较的必要
}
}
if(canAdd == true){//如果开关状态是true,则添加
newArr[newArr.length] = arr[i];
}
}
console.log ( newArr );
/*开关思想
1.当某种情况的结果只有两种情况(开关思想,声明一个布尔类型的值表示开关)
2.随便假设开关一种状态
3.验证你的状态
*/
</script>
求数组中的最大值
function getMaxNum (arr ) {
var max = -Infinity;
for(var i = 0;i<arr.length;i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
var max1 = getMaxNum([10,-50,88,99,100]);
console.log ( max1 );
console.log ( getMaxNum ( [ 90, 88, 60, 200 ] ) );