排序算法
function bsearch (list,item) { //有序队列的二分查找
let lindex = 0
let hindex = list.length-1
let mid
while (lindex<=hindex) {
mid = Math.floor(lindex+(hindex-lindex)/2)
let guess = list[mid]
if(guess==item){
return mid
}else if(guess>item){
hindex = mid - 1
}else{
lindex = mid + 1
}
}
return null
}
let a = [1,3,5,7,9]
let b = bsearch (a,3)
let c = bsearch (a,-1)
console.log(b,c)
function selectSort (arr) {//选择排序 循环找最大或者最小
let index
for(let i = 0;i<arr.length;i++){
index = i
for(let j = i+1;j<arr.length;j++){
if(arr[index] > arr[j]){
index = j
}
}
let temp = arr[i]
arr[i] = arr[index]
arr[index] = temp
}
return arr
}
console.log(selectSort ([3,7,2,4,5,6,4,2,4,7,9,0]))
function fact (n) {//阶乘函数 n! 递归
if(n===1){
return 1
}else{
return n*fact(n-1) //每次递归结果的n变量都会保存在内存中 (每次递归中都会额外保留引用到的变量==>占用内存)
}
}
function newfact (n,a=1) {//尾递归
if(n===1){
return a
}else{
return newfact (n-1,a*n) //函数不存在占用内存的n变量,因为每次递归结果的n变量已经变成参数传入下一次递归的函数中
}
}
console.log(fact (10))
console.log(newfact (10))
function sum (arr) {//递归求和
if(arr.length===0){
return 0
}else if(arr.length===1){
return arr[0]
}else{
let num = arr.shift()
return num + sum(arr)
}
}
let total = sum ([1,2,3,4,5,6,7,8,9])
console.log(total)
function biggest (arr) {//递归求最大数字
if(arr.length===0){
return null
}else if(arr.length===1){
return arr[0]
}else{
if(arr[0]<arr[1]){
arr.splice(0,1)
}else{
arr.splice(1,1)
}
return biggest (arr)
}
}
let bigarr = [2,4,6,8]
console.log(biggest (bigarr))
function quicksort (arr) {
if(arr.length<2){
return arr
}else{
let left = []
let right = []
let std = arr.shift()
for(let i in arr){
if(arr[i]<std){
left.push(arr[i])
}else{
right.push(arr[i])
}
}
return quicksort (left).concat([std],quicksort (right))
}
}
console.log(quicksort ([3,7,2,4,5,6,4,2,4,7,9,0]))