<div class="container text-center">
<div class="section section-title">
<h2>二分查找算法</h2>
</div>
<div class="section input-section">
<div class="col-md-4 col-md-offset-2 col-sm-6 col-sm-offset-3 col-xs-8 col-xs-offset-2">
<div class="input-group generate">
<input type="text" class="form-control input-lg" placeholder="10 - 100" id="generateInput">
<div class="input-group-btn">
<button class="btn btn-default btn-lg" id="generateButton">
生成数组
</button>
</div>
</div>
</div>
<div class="col-md-4 col-md-offset-1 col-sm-6 col-sm-offset-3 col-xs-8 col-xs-offset-2">
<div class="input-group find">
<input type="text" class="form-control input-lg" placeholder="1 - n" id="findInput" disabled>
<div class="input-group-btn">
<button class="btn btn-default btn-lg" type="submit" id="findButton" disabled>
查找数字
</button>
</div>
</div>
</div>
</div>
<div class="col-xs-12 section array-section">
<div class="number">1</div>
<div class="number">2</div>
<div class="number">3</div>
<div class="number">...</div>
<div class="number">n</div>
</div>
</div>
<div id="repeatButton" class="repeatButton">
<span class="glyphicon glyphicon-repeat" aria-hidden="true"></span>
</div>
@mixin center {
display: flex;
justify-content: center;
align-items: center;
}
html,
body {
margin: 0 auto;
box-sizing: border-box;
background: #fcfcfc;
font-family: 'Roboto', sans-serif;
}
.section {
margin-top: 40px;
margin-bottom: 40px;
}
.array-section {
@include center;
flex-wrap: wrap;
}
.input-group {
margin: 5px;
}
.number {
@include center;
width: 40px;
height: 40px;
text-align: center;
margin: 5px;
padding: 5px;
border: 1px solid gray;
border-radius: 3px;
background-color: transparent;
transition: all 0.8s;
}
.error {
background: rgb(202, 60, 60);
color: white;
border: 1px solid rgb(202, 60, 60);
transition: 0.5s;
}
.success {
background: rgb(28, 184, 65);
color: white;
border: 1px solid rgb(28, 184, 65);
transition: 0.5s;
}
.repeatButton {
display: none;
width: 50px;
height: 50px;
position: fixed;
top: 25px;
right: 30%;
border-radius: 25px;
color: #428bca;
background-color: transparent;
border: 2px solid #357ebd;
text-align: center;
transition: all 1s ease;
z-index: 10;
cursor: pointer;
span {
top: 0;
line-height: 50px;
font-size: 20px;
}
}
.repeatButtonToggle {
color: #fff;
background-color: #428bca;
}
View Compiled
$(document).ready(function() {
$('#generateButton').on("click", generateArray);
$('#findButton').on("click", findNumber);
$('#repeatButton').on("click", repeat);
$('#generateInput').keypress(function(e) {
if (e.which == 13) {
generateArray();
}
});
$('#findInput').keypress(function(e) {
if (e.which == 13) {
findNumber();
}
});
function generateArray() {
var $generateGroup = $('.generate');
var $generateInput = $('#generateInput');
var $generateInputVal = $generateInput.val();
var $generateButton = $('#generateButton');
var $findInput = $('#findInput');
var $findButton = $('#findButton');
var $arraySection = $('.array-section');
if ($.isNumeric($generateInputVal) && $generateInputVal >= 10 && $generateInputVal <= 100) {
$generateGroup.removeClass('has-error');
$generateButton.removeClass('error');
$generateGroup.addClass('has-success');
$generateButton.addClass('success');
setTimeout(function() {
$generateGroup.removeClass('has-success');
$generateButton.removeClass('success');
}, 2000);
$generateInput.prop('disabled', true);
$generateButton.prop('disabled', true);
$findInput.prop('disabled', false);
$findButton.prop('disabled', false);
$arraySection.empty();
for (var i = 0; i < $generateInputVal; i++) {
var $number = $('<div>', {
'class': 'number'
});
$arraySection.append($number.text(i + 1));
}
} else {
$generateGroup.removeClass('has-success');
$generateButton.removeClass('success');
$generateGroup.addClass('has-error');
$generateButton.addClass('error');
}
}
async function findNumber() {
var animationSpeed = 1000;
var $generateInput = $('#generateInput');
var $generateInputVal = $generateInput.val();
var $findInput = $('#findInput');
var $findInputVal = $findInput.val();
var $findGroup = $('.find');
var $findButton = $('#findButton');
var min = 1;
var max = parseInt($generateInputVal);
var guess;
console.log($generateInputVal, $findInputVal);
if ($.isNumeric($findInputVal) && $findInputVal >= 1 && $findInputVal <= max) {
$findGroup.removeClass('has-error');
$findButton.removeClass('error');
$findGroup.addClass('has-success');
$findButton.addClass('success');
setTimeout(function() {
$findGroup.removeClass('has-success');
$findButton.removeClass('success');
}, 2000);
$findInput.prop('disabled', true);
$findButton.prop('disabled', true);
while (max >= min) {
guess = Math.floor((min + max) / 2);
var $guessNumber = $('.number:nth-child(' + guess + ')');
await sleep(animationSpeed);
$guessNumber.css({'background-color': '#000', 'color':'#fff', 'font-weight':'bold'});
await sleep(animationSpeed);
if (parseInt($guessNumber.text()) === parseInt($findInputVal)) {
$guessNumber.css({'color':'#fff', 'background-color':'#5cb85c','border': '3px solid #4cae4c', 'width':'42px','height':'42px'});
$('.number').not($guessNumber).css({'opacity':'0.4'});
await sleep(animationSpeed*2);
showRepeatButton();
break;
}
else if (parseInt($guessNumber.text()) < parseInt($findInputVal)) {
$guessNumber.css({'color':'#d43f3a', 'background-color':'#fcfcfc','border': '3px solid #d43f3a'});
await sleep(animationSpeed);
$('.number').slice(min-1,parseInt($guessNumber.text())).css({'opacity':'0.4'});
min = guess + 1;
}
else {
$guessNumber.css({'color':'#d43f3a', 'background-color':'#fcfcfc','border': '3px solid #d43f3a'});
await sleep(animationSpeed);
$('.number').slice(parseInt($guessNumber.text())-1,max).css({'opacity':'0.4'});
max = guess - 1;
}
}
}
else {
$findGroup.removeClass('has-success');
$findButton.removeClass('success');
$findGroup.addClass('has-error');
$findButton.addClass('error');
}
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function showRepeatButton() {
var $repeatButton = $('.repeatButton');
$repeatButton.fadeIn('slow');
$repeatButton.toggleClass('repeatButtonToggle');
setInterval(function(){ $repeatButton.toggleClass('repeatButtonToggle');
}, 1000);
}
function repeat() {
var $generateInput = $('#generateInput');
var $generateButton = $('#generateButton');
var $findInput = $('#findInput');
var $arraySection = $('.array-section');
var $repeatButton = $('.repeatButton');
$generateInput.prop('disabled', false);
$generateButton.prop('disabled', false);
$arraySection.empty();
$repeatButton.fadeOut('slow');
$generateInput.val('');
$findInput.val('');
}
});
View Compiled