运行快速排序时javascript崩溃
我试图用javascript编写一个快速排序,并显示排序后的输出。但每当我运行execute()函数时,程序就会挂起并停止响应。为什么会这样?我对javascript不太熟悉,我只是从java代码中翻译过来的。但我不明白为什么它不起作用。这是代码运行快速排序时javascript崩溃,javascript,sorting,quicksort,Javascript,Sorting,Quicksort,我试图用javascript编写一个快速排序,并显示排序后的输出。但每当我运行execute()函数时,程序就会挂起并停止响应。为什么会这样?我对javascript不太熟悉,我只是从java代码中翻译过来的。但我不明白为什么它不起作用。这是代码 <script type="text/javascript"> function exchange(a, i, j) { var k = a[i]; a[i] = a[j]; a[j] = k; } function pa
<script type="text/javascript">
function exchange(a, i, j) {
var k = a[i];
a[i] = a[j];
a[j] = k;
}
function partition(a2, lo, hi) {
var i2 = lo;
var j2 = hi + 1;
var v = a2[lo];
while (true) {
while (a2[++i2] < v) {
if (i2 == hi) {
break;
}
}
while (v < a2[--j2]) {
if (j2 == lo) {
break;
}
}
if (i2 >= j2) {
break;
}
exchange(a2, i2, j2);
}
exchange(a2, lo, j2);
return j2;
}
function sort(a3, lo2, hi2) {
var j3 = partition(a3, lo2, hi2);
sort(a3, lo2, j3 - 1);
sort(a3, j 3+ 1, hi2);
}
function sort(a4) {
sort(a4, 0, a.length - 1);
}
function execute() {
var array = document.getElementById("texts").value.split(' ');
sort(array);
for (a in array) {
document.write(array[a] + "<br>");
}
}
</script>
功能交换(a、i、j){
var k=a[i];
a[i]=a[j];
a[j]=k;
}
功能分区(a2、lo、hi){
var i2=lo;
变量j2=hi+1;
var v=a2[lo];
while(true){
而(a2[++i2]=j2){
打破
}
交换(a2,i2,j2);
}
交换(a2,lo,j2);
返回j2;
}
函数排序(a3、lo2、hi2){
var j3=分区(a3,lo2,hi2);
排序(a3,lo2,j3-1);
排序(a3,j3+1,hi2);
}
函数排序(a4){
排序(a4,0,a.长度-1);
}
函数execute(){
var数组=document.getElementById(“文本”).value.split(“”);
排序(数组);
for(数组中的一个){
写入(数组[a]+“
”);
}
}
<代码> > p>除非您只是为了好玩而实现快速排序,否则请考虑在数组对象上使用<代码> SoTo()/<代码>方法:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // result: Apple,Banana,Mango,Orange
对数字进行排序时,将函数传递给sort()
,以确定是按升序还是降序排序:
var numbers = [2,41,5,2,16,7];
numbers.sort(function (a,b) { return a-b; });
// result: 2,2,5,7,16,41
如果您想在JavaScript中实现快速排序只是为了好玩,请考虑阅读:它给出了一个很好的算法演练和一些示例代码
参考:
请尝试此代码
<html>
<head>
<title>Quicksort</title>
<script type="text/javascript" src="quicksort.js" >
</script>
</head>
<body>
<form id="qsform" action="" method="" >
<input type="text" size="80" name="unsorted" value="S C K U P E M I B R" /> <br />
<input type="button" name="sort" value="Sort" onclick="dosort(this.form)" /> <br />
<input type="text" size="80" name="sorted" value="" />
</form>
</body>
</html>
快速分类
下面给出了该表单的JavaCScript代码
Array.prototype.swap=function(i, j)
{
var tmp=this[i];
this[i]=this[j];
this[j]=tmp;
}
function partition(array, a2, lo, hi)
{
var piv=array[hi];
array.swap(hi, lo-1);
var store=a2;
var ix;
for(ix=a2; ix<lo-1; ++ix) {
if(array[ix]<=piv) {
array.swap(store, ix);
++store;
}
}
array.swap(lo-1, store);
return store;
}
function qsort(array, a2, lo)
{
if(lo-1>a2) {
var hi=a2+Math.floor(Math.random()*(lo-a2));
hi=partition(array, a2, lo, hi);
qsort(array, a2, hi);
qsort(array, hi+1, lo);
}
}
function quick_sort(array)
{
qsort(array, 0, array.length);
}
function dosort(form)
{
var array=form.unsorted.value.split(/ +/);
quick_sort(array);
form.sorted.value=array.join(' ');
}
Array.prototype.swap=函数(i,j)
{
var tmp=该[i];
这个[i]=这个[j];
这个[j]=tmp;
}
功能分区(阵列、a2、lo、hi)
{
var-piv=数组[hi];
阵列交换(hi,lo-1);
var存储=a2;
var ix;
对于(ix=a2;ix)您是否已对此进行调试以查看它挂起的位置?这看起来很有趣:sort(a3,j 3+1,hi2)
。这应该是j3
,对吗?猜测可能是因为递归调用太深而导致堆栈崩溃,或者是因为某段代码执行时间太长而导致浏览器没有响应。另外,您有两个排序()的定义
.JavaScript不支持以通常的面向对象的方式重载方法。这可能是问题的一部分。我猜您正在调用排序()的第二个定义
。这就是为什么你没有理解@Guffa在他的评论中指出的内容。因为代码没有被执行。@pge,我不知道java脚本与OOP做的不一样。我只是从java翻译了这个,没有重写它。你能进一步解释重载方法吗?关于排序的第二个定义,你指的是带3个参数的递归排序还是带1的排序?这不是执行吗?@pje,我不知道java脚本与OOP做的不一样。我只是从java翻译了这个,没有重写它。你能进一步解释重载方法吗?关于排序的第二个定义,你是指带3个参数的递归排序还是带有1?的排序,该排序不是EXExecuting?-