1.排序
1.1 桶排序
题:
JS代码:
var score=[5,5,2,8,3];
var arr=new Array(11);
for(var i=0;i<arr.length;i++){
arr[i]=0;//初始化原数组为全0
}
for(var j=0;j<score.length;j++){
var t=score[j];//将成绩数组里面的值依次赋给t
arr[t]++;//再把这个成绩出现在arr数组中下标的值++
}
for(var i=1;i<=10;i++){ //外层循环arr数组的10个值
for(var j=0;j<arr[i];j++){ //内层循环输出有出现过的数据的下标
console.log(i)
}
}
结果:
题目的要求需要输出为降序,只需修改部分代码:
// 降序
for(var i=10;i>=0;i--){ //外层循环arr数组的10个值
for(var j=0;j<arr[i];j++){ //内层循环输出有出现过的数据的下标
console.log(i)
}
算法拓展:
代码:
输入你需要随机生成几个数据:<input type="text" placeholder="请输入整数"><br>
var n;
var book=new Array(1001);
var list=[];
var input =document.querySelector('input');
input.onblur=function(){
n=parseInt(input.value);//得到需要随机生成几个整数
for(var i=0;i<n;i++){
var num=Math.floor(Math.random()*1000);
list.push(num);//将随机生成的数追加到数组list里面
}
console.log(list)
for(var i=0;i<book.length;i++){
book[i]=0;//初始化原数组为全0
}
for(var i=0;i<list.length;i++){
var t=list[i];//将随机生成的数依次赋值给t
book[t]++;//记录book数组中下标为t的数出现的次数
}
for(var i=1;i<=1000;i++){
for(var j=0;j<book[i];j++){
console.log(i)
}
}
}
结果:
降序为:
// 降序
for(var i=1000;i>=0;i--){
for(var j=0;j<book[i];j++){
console.log(i)
}
}
1.2 冒泡排序
根据书中的描述我写出的代码:
var arr=[11,25,62,22,14]
for(var i=0;i<arr.length-1;i++){//需要比较的次数
for(var j=0;j<arr.length-i;j++){//依次比较
if(arr[j]<arr[j+1]){//这里的大于小于控制升序和降序
var t=arr[j]
arr[j]=arr[j+1]
arr[j+1]=t
}
}
}
console.log(arr)
改写成n个数据:
输入你需要随机生成几个数据:<input type="text" placeholder="请输入整数"><br>
var input=document.getElementsByTagName('input');
var n
var arr=[]
input[0].onblur=function(){
n=this.value//随机生成多少个数据
for(var i=0;i<n;i++){
var number=Math.floor(Math.random()*1000)
arr.push(number)
}
console.log(arr)//输出随机生成的数据数组
for(var i=0;i<arr.length-1;i++){//需要比较的次数
for(var j=0;j<arr.length-i;j++){//依次比较
if(arr[j]<arr[j+1]){//这里的大于小于控制升序和降序
var t=arr[j]
arr[j]=arr[j+1]
arr[j+1]=t
}
}
}
console.log(arr)
}
结果:
对1.1的成绩排序优化:输出成绩从高到低的姓名
//模拟数据
var obj=[
{
name:'胡桃',
score:60
},
{
name:'甘雨',
score:98
},
{
name:'雷军',
score:71
},
{
name:'七七',
score:77
},
{
name:'迪卢克',
score:48
},
{
name:'凯亚',
score:56
},
]
for(var i=0;i<obj.length-1;i++){//需要比较的次数
for(var j=0;j<obj.length-i-1;j++){//依次比较
// console.log(j+':'+obj[j+1].score)
if(obj[j].score<obj[j+1].score){//obj[j+1].score有个小bug,需要在前面多减一个1
var t=obj[j]
obj[j]=obj[j+1]
obj[j+1]=t
}
}
}
//遍历输出名字
console.log(obj)
for(var i=0;i<obj.length;i++){
console.log(obj[i].name)
}
1.3 快速排序
这个部分的漫画解析生动形象,便于代码理解,建议看原书
function quicksort(left,right){
if(left>right){
return;//判断传入的参数是否有问题
}
var temp=arr[left]//temp存入基准值
var i=left
var j=right
while(i!=j){
//先从右往左找
while(arr[j]>=temp && i<j){
j--;
}
//再从左往右找
while(arr[i]<=temp && i<j){
i++;
}
//交换两个数在数组中的位置
if(i<j)//当哨兵i和哨兵j没有相遇时
{
var t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
//*****将基准数归位
arr[left]=arr[i];
arr[i]=temp;
console.log(arr)//输出查看每次排序后的结果
quicksort(left,i-1);//继续处理左边的,递归调用
quicksort(i+1,right);//继续处理右边的,递归调用
}
//测试
var arr=[2,1,5,4,6,3,8,9,7,10]
quicksort(0,9)
console.log('快速排序结果:'+arr)
1.4 小哼买书
2.栈、队列、链表
2.1 队列
var arr=new Array(30)
arr.unshift(6,3,1,7,5,8,9,2,4)
var newArr=[]
//初始化队列
var head=0;
var tail=9;
while(head<tail){//队列补位空的时候执行
//将每一次删除的存入新数组
newArr.push(arr[head])
//队首出队
head++;
//将新的队首添加到队尾
arr[tail]=arr[head];
tail++
head++
}
console.log(arr)
//小哈qq号
console.log(newArr)
2.2 栈
回文字符的判断
//判断是否为回文字符
var str='aahhaa';
var res=judge(str);
console.log(res)
function judge(str){
//定义一个空栈数组
var a=[]
//初始化栈顶
var top=0;
//定义比较的下标
var next;
//得到字符串的中间点的下标
var mid=Math.floor(str.length/2-1);
//将中间下标之前的字符入栈
for(var i=0;i<=mid;i++){
a[top++]=str[i]
}
//判断字符串长度为奇数还是偶数,得到开始比较的下标
if(str.length%2==0){
next=mid+1
}else{
next=mid+2
}
//开始匹配
for(var i=next;i<str.length;i++){
if(str[i]!=a[top-1]){
break;
}
top--
}
//如果是回文字符串,那么top的值就会变为0,因为每个字符都被匹配到了
if(top==0){
return 'Yes!'
}else{
return 'No!'
}
}