java算法学习.docx
《java算法学习.docx》由会员分享,可在线阅读,更多相关《java算法学习.docx(42页珍藏版)》请在冰豆网上搜索。
java算法学习
算法的五个特征
1)有穷性:
对于任意一组合法输入法,在执行有穷步骤后一定能结束.同时算法的每个步骤都能在有限的时间内完成.
2)确定性:
在每种情况下所应执行的步骤,,在算法中都有确切的规定.并且算法在任何情况下都只有一条执行路径.
3)可行性:
算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作,进行有限次的运算完成.
4)有输入
5)有输出
算法的设计原则:
正确性;
可读性;
健壮性;
高效率与低存储;
最大公约数算法
计算两个非负整数p和q的最大公约数:
若
q是0,则最大公约数为p。
否则,将p除以
q得到余数r,p和q的最大公约数即为q和
r的最大公约数。
publicstaticintgcd(intp,intq){
if(q==0)
returnp;
intr=p%q;
returngcd(q,r);
}
二分查找法算法
递归二分查找法:
staticintbinarySearch(intArray[],intlow,inthigh,intkeyValue){
if(low<=high){
intmid=(low+high)/2;
if(keyValue==Array[mid])
returnmid;
elseif(keyValue//移动low和high
returnbinarySearch(Array,low,mid-1,keyValue);
elseif(keyValue>Array[mid])
returnbinarySearch(Array,mid+1,high,keyValue);
}else{
return-1;
}
return-1;
}
排序
选择排序:
下面是手写的选择排序
packagecom.test.algorithm;
importjava.util.Random;
/**
*选择排序:
从数组中选取最小的,然后放入开头,然后再从剩下的选择最小的如此往复.
*思路:
把第一个单独出来,从剩下的数组中选取最大的,然后用最大的跟被独立出来的比较,谁大就把谁放在哪个位置,如此往复
*
*@authorly-xguoqiang
*
*/
publicclassSelectSort{
/**
*
*@return
*/
privatestaticintgetMax(Integer[]array){
if(array==null||array.length<=1){
return0;
}
intindex=0;
inttemp=array[0];
for(inti=1;iif(temptemp=array[i];
index=i;
}
}
returnindex;
}
publicstaticInteger[]selectSort(Integer[]array){
if(array==null||array.length<=1){
returnarray;
}
for(inti=0;iInteger[]temp=newInteger[array.length-i-1];
System.arraycopy(array,i+1,temp,0,array.length-i-1);
intindex=getMax(temp);
if(array[i+index+1]>array[i]){
Integernum=array[i];
array[i]=array[i+index+1];
array[i+index+1]=num;
}
}
returnarray;
}
publicstaticvoidmain(String[]args){
Randomrandom=newRandom();
Integer[]array=newInteger[1000];
for(inti=0;i<1000;i++){
array[i]=random.nextInt(10000);
}
Integer[]selectSort=selectSort(array);
for(Integerinteger:
selectSort){
System.out.println(integer);
}
}
}
冒泡排序
packagecom.test.algorithm;
importjava.util.Random;
/**
*思维:
其实就是不停的比较,如果大就交换.可以看成是石头不停的往下层
*@authorly-xguoqiang
*
*/
publicclassBubbleSort{
publicstaticInteger[]bubbleSort(Integer[]array){
for(inti=0;ifor(intj=0;jif(array[j]>array[j+1]){
inttemp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
returnarray;
}
publicstaticvoidmain(String[]args){
Integer[]array=getArray();
for(Integerinteger:
bubbleSort(array)){
System.out.println(integer);
}
}
publicstaticInteger[]getArray(){
Randomrandom=newRandom();
Integer[]array=newInteger[1000];
for(inti=0;i<1000;i++){
array[i]=random.nextInt(10000);
}
returnarray;
}
}
插入排序
packagecom.test.algorithm;
importjava.util.Collections;
importjava.util.LinkedList;
importjava.util.List;
/**
*插入排序:
网上的写法等下看.我们先写一个需要额外创建一个数组的做法来写
*
*@authorly-xguoqiang
*
*/
publicclassInsertSort{
publicstaticInteger[]insertSort(Integer[]array){
Listresult=newLinkedList<>();
result.add(array[0]);
for(inti=1;iintj=0;
while(true){
//如果大于就插入
if(j==result.size()||result.get(j)>array[i]){
result.add(j,array[i]);
break;
}
j++;
}
}
returnresult.toArray(array);
}
publicstaticvoidmain(String[]args){
Integer[]insertSort=insertSort(BubbleSort.getArray());
for(Integerinteger:
insertSort){
System.out.println(integer);
}
}
//这个方法是网上的排序的方法.
publicstaticInteger[]sort(Integer[]integers){
intj;
//从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
for(inti=1;iinttmp=integers[i];//记录要插入的数据
j=i;
while(j>0&&tmpintegers[j]=integers[j-1];//向后挪动
j--;
}
integers[j]=tmp;//存在比其小的数,插入
}
returnintegers;
}
}
栈
英文(Stack)一端插入和删除的特殊线性表.遵从先进后出的原则.
对栈的插入与删除不需要修改栈底的指针.
允许插入以及删除的一端称为栈顶(top).另一端称为栈底(bottom);栈中没有元素的时候称为空栈,插入称为进栈(push),删除称为退栈(pop)
下面是自己写的实现,如果以后有能力了,可以用阻塞队列写一个并发的栈.下面红色部分是看了网上的代码才发现的bug.这个要注意
Java里面Vector下面有一个实现类.stock.其实就是栈.
packagecom.test.algorithm;
/**
*自己实现栈
*@authorly-xguoqiang
*
*/
publicclassMystack{
//用来保存数据
privateint[]array;
//栈的容量
privateintmaxsize;
//栈顶指针
privateinttop=-1;
publicMystack(intmaxsize){
if(maxsize<0){
thrownewIllegalArgumentException("栈初始容量不能小于0:
"+maxsize);
}
this.maxsize=maxsize;
array=newint[maxsize];
}
/