算法 快排解析

知道了快排的算法之后,就泄露一个程序(js)
代码如下

function searchDeep(arr){
var j=arr.length-1;
var i=1,exchange=0;
var len=arr.length;
var temp=a[0],temp1;
var b=[len];
var tag=0;
for(var i=0; i<len; i++)//init mark array b b[i]=0 说明该位未确定 ;b[i]=1说明该位已确定
b[i]=0;

function loop(i,j){
do{
while(a[j]>temp)
j--;
while(a[++i]<temp&&i<j){}
if(i==j) break;
temp1=a[i];a[i]=a[j];a[j]=temp1;
j--;
if(i==j) break;

}while(i+1!==j)

temp1=temp;temp=a[i];a[i]=temp1;b[i]=1;
}}

while(1){
for(var k=0;k<len,k++){
if(b[k]==0){
i=key;
tag=1;
continue;
}
if( ( (k==len-1) || b[k]==1 ) && tag ){
if(k==len-1) j=k;
ele j=k-1;
tag=0;
break;
}
}
if(i==j) b[i]=1;
else { temp=a[i];
loop(i,j);
}
if(k==len) break;
}


}

我先用b[i]=0来标记还未排序的位,一旦排好则置它为1。对比标准算法,错误原因分析。当时写的时候有想用到递归来做,可是硬是没有把它分析出来,感觉子问题就是和原问题不一致,现在看着标准程序走了一便,发现确实是递归啊,分析下,(设为total)先是ij从两边开始,直到ij相等(这也是我饿自己写的程序自己给自己增加了复杂度i+1!=j,下一次一定注意!) 则将标准比较值赋给该元素完成一轮,下一步是分别对左边(设为l)和右边(设为r)执行相同操作,在左边的时候依然会出现一个情况 i==j,此时又分为左边和右边 右边也一样的情况,
如图所示
[img]http://dl2.iteye.com/upload/attachment/0109/2610/a7579b86-5507-319a-8fd8-055ced4d6055.png[/img]
则这就是一个递归 只是在一个函数中要调用两次
上标准算法
#include<stdio.h>
int a[101],n,temp1;
void quicksort(int left,int right)
{
int i,j,t,temp;
temp=a[left];
i=left;
j=right;
if(i>=j)//当有一个或无元素时返回递归
return;
do{
while(a[j]>temp&&i<j)//向左寻找较小的
j--;
while(a[i]<temp&&i<j)//向右寻找较大的
i++;

temp1=a[i];a[i]=a[j];a[j]=temp1;


}while(i!==j)
//当i=j时跳出循环说明碰头了将基准值放在这里
temp1=temp;temp=a[i];a[i]=temp1;
quicksort(left,i-1);//处理右边
quicksort(i+1,right)//处理左边
}
}

为何先是右边的往左查找 避免一种情况 6 3 8 9 10 11 i指着3(刚进行过交换 3和11) j指着11 若左边先往右边查找,则会直接到11停止此时跳出内循环将11 与6交换 出问题了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值