Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行快速排序时javascript崩溃_Javascript_Sorting_Quicksort - Fatal编程技术网

运行快速排序时javascript崩溃

运行快速排序时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

我试图用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 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?-