网上摘得的
来源:互联网 发布:物流企业软件 编辑:程序博客网 时间:2024/05/01 05:56
* by 沈东良/良少 * @param array
* @param start
* @param end 这是最后一个元素的索引,第一次调用应该是array.length-1
* @param value
* @return
*/
public static int binarySearch(int[] array,int start,int end,int value){
int middle=(start+end)/2;
if(end<start){
return -1;
}
if(end==(start+1)){
if(array[start]==value){
return start;
}else if(array[end]==value){
return end;
}
}else if(array[middle]==value){
return middle;
}else if(value>array[middle]){
return binarySearch(array,middle+1,end,value);
}else if(value<array[middle]){
return binarySearch(array,start,middle-1,value);
}
return -1;
}
上述代码稍加改变,就可以排序任意类型。如使用泛型,然后加上对Comparable接口的实现,即可。
快速排序算法
二分搜索算法确实非常快,但是它只能用于已排序数组。如果数组未排序呢,该怎么办呢?简单,先用快速排序算法进行排序,然后再用二分搜索进行搜索。
二分搜索算法确实非常快,但是它只能用于已排序数组。如果数组未排序呢,该怎么办呢?简单,先用快速排序算法进行排序,然后再用二分搜索进行搜索。
先排序再搜索,要比匹配每一个元素快得多。搜索引擎,数据库索引也都使用了对数据集合的排序技术,这样搜索数据才会快速。
理论:
最慢,也是最容易想到的排序算法是插入排序算法:
最慢,也是最容易想到的排序算法是插入排序算法:
1, 遍历数组,找出最小的元素,把它放到第一个元素。
2, 循环查找未排序的数组,直到整个数组排序。
这需要2个嵌套的循环,意味着它的效率是O(n^2);
之所以插入排序的效率如此之地,是因为要找出整个数组中最小的数据,需要遍历整个数组的元素。
而插入排序聪明就聪明在它不查找整个数组最小、次小…的元素,而是每次仅仅把小于某个元素的值移到一边,通过迭代最终自动实现排序。这就大大节约了排序所需的计算步骤。
快速排序算法的理论:
1, 如果S中的元素个数是0或者1,那么返回。
2, 选取S中的任一元素v,称为中心点。
3, 将S集合中的元素分为2个部分:L={小于pivot 的元素+ pivot }和R={大于或者等于pivot的元素}。
4, 返回L和R。
我们使用Java使用的是就地排序的方式,因此不需要返回值。
因为Java是一种可以修改变量的语言,用函数式语言的术语来说,就是有“副作用”。我们利用这个副作用直接修改作为参数的Array,不需要返回值。
代码:
/** by 沈东良/良少
/** by 沈东良/良少
* 快速排序,有副作用 从小到大
* @param array
* @param start
* @param end这是最后一个元素的索引,第一次调用应该是array.length-1
*/
public static void quickSort(int[] array,int start,int end){
//有可能造成start>end 因为递归调用时j+1,可能引起j比end还大1。 另外如果数组是空的,或者输入错误也会出现这种情况
if(end<=start){
return;
}else {
//取中间元素为中心点,然后移到最右边
int sign=(start+end)/2;
int tmp=array[end];
array[end]=array[sign];
array[sign]=tmp;
int j=start;
for(int i=start;i<=end-1;i++){
//小于的元素和标记互换,等于的不能互换,否则会形成死循环
if(array[i]<array[end]) {
tmp=array[i];
array[i]=array[j];
array[j]=tmp;
j=j+1;
}
}
//把标记元素和第一个>=它的元素位置互换,这样数组就分成2个部分,一个部分比中心值小,一个部分比中心值大。
tmp=array[j];
array[j]=array[end];
array[end]=tmp;
quickSort(array,start,j);
quickSort(array,j+1,end);
}
}
- 网上摘得的
- 在网上摘来的一些言语,有些真得的有些道理。
- 刚从网上看来得一段大数相乘的代码
- 在网上看到的学习C++的建议(个人觉得说得不错)
- 控制台设置字体的大小,网上找得自己还没来的及实现
- 网上找得哲学家就餐问题的一段据说不错的代码
- 想设置CListStrl的每一行的颜色,网上找到了如下文章,讲得不错
- 网上提问的技巧[这个版本写得不错,存档留底]
- 网上提问的技巧[这个版本写得不错,存档留底]
- 嵌入式的C++标准——读书偶得,网上目前还搜不到
- 解决 openLDAP for windows 的一个小问题,网上问得比较多
- 二叉树~~~非递归便利~~~觉得写得赞的几个方法(自己+网上)
- 一个卖家的自述:网上开店 你能走得更远-
- 转载-个人看了网上很多String常量池的博客,这一篇写得最好
- 网上得来 彻底删除请求号
- sql XML操作(这是网上搜的,感谢整理的人。也留着以后万一用得着的时候)
- /* 树的先根周游的非递归算法*/ 张老师得代码功能不好 网上中序可以 /*
- 网上看到的,真TM说得太对了!特意跟男同胞们分享!觉得好就顶一下!
- csdn学生大本营。。。
- 转:程序员的十层楼!
- 程序员的十层楼(4~5层)
- 程序员的十层楼(6~7层)
- 世界上最遥远的距离(中+法+英)
- 网上摘得的
- [转]VB.net安装包制作全过程(不包含数据库)
- Oracle数据库基础阶段测试题看你会多少?
- Oracle数据库基础阶段测试题答案
- 思路乱了
- JBuilder 2008破解文件
- Oracle收购sun
- 感觉
- LINUX NIS 服务器简易配置