一段JS代码不知道为什么执行不了,大家帮忙看看啊

Zimmerk 2011-12-05 11:34:06

var array=[19,95,10,27,8];
function QuickSort(left,right)
{
if(left>=right)
return;
var key=array[left];
while(right>left)
{
while(right>left&&array[right]>=key) right--;
array[left]=array[right];
while(right>left&&array[left]<=key) left++;
array[right]=array[left];
}
array[left]=key;
QuickSort(0,left-1);
QuickSort(left+1,array.length-1);
}
QuickSort(0,array.length-1);
document.write(array);

以上代码是实现快速排序的,但最后输出不了结果,我是了下,发现注释了QuickSort函数里调用自身递归的其中一条,就正常,不知道是为什么,大家帮忙看看是怎么回事啊
...全文
183 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
峭沙 2011-12-06
  • 打赏
  • 举报
回复
我了个去,一个简单的排序需要3个循环?
hookee 2011-12-05
  • 打赏
  • 举报
回复

<script>
function getMedian(p,q){
var r = Math.floor((p+q)/2);
if(array[p]<array[r]){
if(array[p]>=array[q]) return p;
else{
if(array[q]>=array[r]) return r;
else return q;
}
}
else{
if(array[r]>=array[q]) return r;
else{
if(array[p]>=array[q]) return q;
else return p;
}
}
}
function partition(f,l){
var i,j,m,t,temp;
i = f;
j = l;
t = getMedian(i,j);
m = array[t];
while(i<=j){
while(j>=f && array[j]>=m){
j--;
}
while(i<=l && array[i]<m){
i++;
}
if(i<j){
temp = array[i];
array[i] = array[j];
array[j] = temp
i++;
j--;
}
}
if(i==f){
temp = array[i];
array[i] = array[t];
array[t]= temp;
i++;
}
return i;
}

function quickSort(f,l){
if(f >= l) return;
var k = partition(f,l);
quickSort(f,k-1);
quickSort(k,l);
}
var array=[19,95,10,27,8];
quickSort(0,array.length-1);
document.write(array);
</script>
oggmm 2011-12-05
  • 打赏
  • 举报
回复
难不成你还想两个自身调用的递归会同时执行
QuickSort(0,left-1);
QuickSort(left+1,array.length-1);
表示不懂
Zimmerk 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zsx841021 的回复:]

array[left]<=key改为array[right]<=key
[/Quote]
不明白这是什么意思,我那行是从左边开始比较,大过key的就移到key所在的位置啊,没有写错吧
而且改了也无法输出结果
三石-gary 2011-12-05
  • 打赏
  • 举报
回复
array[left]<=key改为array[right]<=key
Zimmerk 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lsw645645645 的回复:]

你的问题在于这句:
QuickSort(0,left-1);
第一个参数,始终都是0,它是递归调用的。分隔后的第一个参数是变的。而你始终都是数组的第一个位置。
[/Quote]
谢谢指点,弄了半天原来这里写错了,我再修改一下看看,谢谢了
lsw645645645 2011-12-05
  • 打赏
  • 举报
回复
你的问题在于这句:
QuickSort(0,left-1);
第一个参数,始终都是0,它是递归调用的。分隔后的第一个参数是变的。而你始终都是数组的第一个位置。
lsw645645645 2011-12-05
  • 打赏
  • 举报
回复

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">

function Partition(arr, left, right) {
var pivokey = arr[left];
while (left < right) {
while (left < right && arr[right] > pivokey) {
right--;
}
arr[left] = arr[right];
while (left < right && arr[left] < pivokey) {
left++;
}
arr[right] = arr[left];
}
arr[left] = pivokey;
return left;
}
function QuickSort(arr, left, right) {
if (left < right) {
var pivoloc = Partition(arr, left, right);
QuickSort(arr, left, pivoloc - 1);
QuickSort(arr, pivoloc + 1, right);
}
}

</script>
</head>
<body>
<script type="text/javascript">

var arr = [3, 5, 6, 1, 2, 7, 8, 4]
QuickSort(arr, 0, arr.length-1);
alert(arr);

</script>
</body>
</html>

Zimmerk 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hookee 的回复:]

HTML code

<script>
function getMedian(p,q){
var r = Math.floor((p+q)/2);
if(array[p]<array[r]){
if(array[p]>=array[q]) return p;
else{
if(array[q]>=array[r]) ret……
[/Quote]
你的代码能正常运行,但我想知道我的代码哪里出现问题了?为什么自身连续递归两次就运行不了?望解答
Zimmerk 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 oggmm 的回复:]

难不成你还想两个自身调用的递归会同时执行
QuickSort(0,left-1);
QuickSort(left+1,array.length-1);
表示不懂
[/Quote]
这不是先执行上一个递归再执行下一个递归么?应该没有错啊

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧