「java用的最多的算法」java对算法要求高吗

博主:adminadmin 2022-12-22 18:06:09 56

本篇文章给大家谈谈java用的最多的算法,以及java对算法要求高吗对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

设计一个Java算法 读取两个最多为30位数的整数 然后输出两个整数的和 只能使用arrays来做

package image;

import java.text.DecimalFormat;

import java.util.Scanner;

public class Lab8

{

private static String add ( String a, String b )

{

char[] ac = a.toCharArray ();

char[] bc = b.toCharArray ();

String longer = ac.length  bc.length ? a : b;

int end1 = ac.length - 1, end2 = bc.length - 1, end = 0;

int high = 0, low = 0;

String listenup = "";

while (end = end1  end = end2)

{

int result = Integer.parseInt (bc[end2 - end] + "") + Integer.parseInt (ac[end1 - end] + "") + high;

high = result / 10;

low = result % 10;

listenup = low + listenup;

end++;

}

String other = longer.substring (0, Math.abs (ac.length - bc.length));

String highest = "";

if (!"".equals (other))

{

highest = Integer.parseInt (other) + high + "";

}

return highest + listenup;

}

private static String multiply ( String a, String b )

{

char[] ac = a.toCharArray ();

char[] bc = b.toCharArray ();

char[] longer = ac.length  bc.length ? ac : bc;

char[] shorter = ac.length  bc.length ? bc : ac;

if (ac.length == bc.length)

{

longer = ac;

shorter = bc;

}

String strs = "";

for ( int i = shorter.length - 1; i = 0; i-- )

{

int ax = Integer.parseInt (shorter[i] + "");

int high = 0, low = 0;

String listenup = "";

for ( int j = longer.length - 1; j = 0; j-- )

{

int result = ax * Integer.parseInt (longer[j] + "") + high;

high = result / 10;

low = result % 10;

listenup = low + listenup;

if (j == 0)

{

listenup = high + listenup;

}

}

strs = listenup + "|" + strs;

}

strs = strs.substring (0, strs.length () - 1);

System.err.println (strs);

if (strs.indexOf ("|") == -1)

{

if (strs.matches ("^0+$"))

{

return "0";

}

return strs;

}

String[] rs = strs.split ("\\|");

String temp = "";

for ( int i = 0; i  rs.length - 1; i++ )

{

String first = "";

if (i == 0)

{

temp = rs[i];

}

first = temp + "0";

String second = "";

for ( int j = 0; j = i; j++ )

{

second += "0";

}

second += rs[i + 1];

temp = add (first, second);

}

return temp;

}

public static void main ( String[] args )

{

Scanner scanner = new Scanner (System.in);

DecimalFormat df = new DecimalFormat ("#,##,###");

String reg = "^0|[1-9]\\d{0,29}$", first = "", second = "", which = "";

int step = 0;

while (true)

{

if (step == 0)

{

System.out.print ("选择运算方式 (a/A: 加法,m/M:乘法):");

which = scanner.nextLine ().trim ();

if (!"a".equalsIgnoreCase (which)  !"m".equalsIgnoreCase (which))

{

continue;

}

step = 1;

}

if (step == 1)

{

System.out.print ("输入第一个整数为:");

first = scanner.nextLine ().trim ();

if (!first.matches (reg))

{

System.out.println ("\n输入不正确,重新输入.");

continue;

}

step = 2;

}

else if (step == 2)

{

System.out.print ("输入第二个整数为:");

second = scanner.nextLine ().trim ();

if (!second.matches (reg))

{

System.out.println ("\n输入不正确,重新输入.");

continue;

}

step = 3;

}

else if (step == 3)

{

System.out.println ();

String f = df.format (Double.valueOf (first));

String s = df.format (Double.valueOf (second));

if (f.length ()  s.length ())

{

for ( int i = 0; i = s.length () - f.length (); i++ )

{

System.out.print (" ");

}

}

if ("a".equalsIgnoreCase (which))

{

System.out.println (f + "+");

}

else

{

System.out.println (f + "X");

}

if (s.length ()  f.length ())

{

for ( int i = 0; i = f.length () - s.length (); i++ )

{

System.out.print (" ");

}

}

System.out.println (s);

System.out.println ("--------------------");

if ("a".equalsIgnoreCase (which))

{

System.out.println (df.format (Double.valueOf (add (first, second))));

}

else

{

System.out.println (df.format (Double.valueOf (multiply (first, second))));

}

System.out.println ("是否继续?(n/* | N/*)");

if ("n".equalsIgnoreCase (scanner.nextLine ().trim ()))

{

break;

}

else

{

step = 0;

continue;

}

}

}

scanner.close ();

}

}

数据结构 java开发中常用的排序算法有哪些

排序算法有很多,所以在特定情景中使用哪一种算法很重要。为了选择合适的算法,可以按照建议的顺序考虑以下标准:

(1)执行时间

(2)存储空间

(3)编程工作

对于数据量较小的情形,(1)(2)差别不大,主要考虑(3);而对于数据量大的,(1)为首要。

主要排序法有:

一、冒泡(Bubble)排序——相邻交换

二、选择排序——每次最小/大排在相应的位置

三、插入排序——将下一个插入已排好的序列中

四、壳(Shell)排序——缩小增量

五、归并排序

六、快速排序

七、堆排序

八、拓扑排序

一、冒泡(Bubble)排序

----------------------------------Code 从小到大排序n个数------------------------------------

void BubbleSortArray()

{

for(int i=1;in;i++)

{

for(int j=0;in-i;j++)

{

if(a[j]a[j+1])//比较交换相邻元素

{

int temp;

temp=a[j]; a[j]=a[j+1]; a[j+1]=temp;

}

}

}

}

-------------------------------------------------Code------------------------------------------------

效率 O(n²),适用于排序小列表。

二、选择排序

----------------------------------Code 从小到大排序n个数--------------------------------

void SelectSortArray()

{

int min_index;

for(int i=0;in-1;i++)

{

min_index=i;

for(int j=i+1;jn;j++)//每次扫描选择最小项

if(arr[j]arr[min_index]) min_index=j;

if(min_index!=i)//找到最小项交换,即将这一项移到列表中的正确位置

{

int temp;

temp=arr[i]; arr[i]=arr[min_index]; arr[min_index]=temp;

}

}

}

-------------------------------------------------Code-----------------------------------------

效率O(n²),适用于排序小的列表。

三、插入排序

--------------------------------------------Code 从小到大排序n个数-------------------------------------

void InsertSortArray()

{

for(int i=1;in;i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分

{

int temp=arr[i];//temp标记为未排序第一个元素

int j=i-1;

while (j=0 arr[j]temp)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/

{

arr[j+1]=arr[j];

j--;

}

arr[j+1]=temp;

}

}

------------------------------Code--------------------------------------------------------------

最佳效率O(n);最糟效率O(n²)与冒泡、选择相同,适用于排序小列表

若列表基本有序,则插入排序比冒泡、选择更有效率。

四、壳(Shell)排序——缩小增量排序

-------------------------------------Code 从小到大排序n个数-------------------------------------

void ShellSortArray()

{

for(int incr=3;incr0;incr--)//增量递减,以增量3,2,1为例

{

for(int L=0;L(n-1)/incr;L++)//重复分成的每个子列表

{

for(int i=L+incr;in;i+=incr)//对每个子列表应用插入排序

{

int temp=arr[i];

int j=i-incr;

while(j=0arr[j]temp)

{

arr[j+incr]=arr[j];

j-=incr;

}

arr[j+incr]=temp;

}

}

}

}

--------------------------------------Code-------------------------------------------

适用于排序小列表。

效率估计O(nlog2^n)~O(n^1.5),取决于增量值的最初大小。建议使用质数作为增量值,因为如果增量值是2的幂,则在下一个通道中会再次比较相同的元素。

壳(Shell)排序改进了插入排序,减少了比较的次数。是不稳定的排序,因为排序过程中元素可能会前后跳跃。

五、归并排序

----------------------------------------------Code 从小到大排序---------------------------------------

void MergeSort(int low,int high)

{

if(low=high) return;//每个子列表中剩下一个元素时停止

else int mid=(low+high)/2;/*将列表划分成相等的两个子列表,若有奇数个元素,则在左边子列表大于右侧子列表*/

MergeSort(low,mid);//子列表进一步划分

MergeSort(mid+1,high);

int [] B=new int [high-low+1];//新建一个数组,用于存放归并的元素

for(int i=low,j=mid+1,k=low;i=mid j=high;k++)/*两个子列表进行排序归并,直到两个子列表中的一个结束*/

{

if (arr[i]=arr[j];)

{

B[k]=arr[i];

I++;

}

else

{ B[k]=arr[j]; j++; }

}

for( ;j=high;j++,k++)//如果第二个子列表中仍然有元素,则追加到新列表

B[k]=arr[j];

for( ;i=mid;i++,k++)//如果在第一个子列表中仍然有元素,则追加到新列表中

B[k]=arr[i];

for(int z=0;zhigh-low+1;z++)//将排序的数组B的 所有元素复制到原始数组arr中

arr[z]=B[z];

}

-----------------------------------------------------Code---------------------------------------------------

效率O(nlogn),归并的最佳、平均和最糟用例效率之间没有差异。

适用于排序大列表,基于分治法。

六、快速排序

------------------------------------Code--------------------------------------------

/*快速排序的算法思想:选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。*/ void swap(int a,int b){int t;t =a ;a =b ;b =t ;}

int Partition(int [] arr,int low,int high)

{

int pivot=arr[low];//采用子序列的第一个元素作为枢纽元素

while (low high)

{

//从后往前栽后半部分中寻找第一个小于枢纽元素的元素

while (low high arr[high] = pivot)

{

--high;

}

//将这个比枢纽元素小的元素交换到前半部分

swap(arr[low], arr[high]);

//从前往后在前半部分中寻找第一个大于枢纽元素的元素

while (low high arr [low ]=pivot )

{

++low ;

}

swap (arr [low ],arr [high ]);//将这个枢纽元素大的元素交换到后半部分

}

return low ;//返回枢纽元素所在的位置

}

void QuickSort(int [] a,int low,int high)

{

if (low high )

{

int n=Partition (a ,low ,high );

QuickSort (a ,low ,n );

QuickSort (a ,n +1,high );

}

}

----------------------------------------Code-------------------------------------

平均效率O(nlogn),适用于排序大列表。

此算法的总时间取决于枢纽值的位置;选择第一个元素作为枢纽,可能导致O(n²)的最糟用例效率。若数基本有序,效率反而最差。选项中间值作为枢纽,效率是O(nlogn)。

基于分治法。

七、堆排序

最大堆:后者任一非终端节点的关键字均大于或等于它的左、右孩子的关键字,此时位于堆顶的节点的关键字是整个序列中最大的。

思想:

(1)令i=l,并令temp= kl ;

(2)计算i的左孩子j=2i+1;

(3)若j=n-1,则转(4),否则转(6);

(4)比较kj和kj+1,若kj+1kj,则令j=j+1,否则j不变;

(5)比较temp和kj,若kjtemp,则令ki等于kj,并令i=j,j=2i+1,并转(3),否则转(6)

(6)令ki等于temp,结束。

-----------------------------------------Code---------------------------

void HeapSort(SeqIAst R)

{ //对R[1..n]进行堆排序,不妨用R[0]做暂存单元 int I; BuildHeap(R); //将R[1-n]建成初始堆for(i=n;i1;i--) //对当前无序区R[1..i]进行堆排序,共做n-1趟。{ R[0]=R[1]; R[1]=R[i]; R[i]=R[0]; //将堆顶和堆中最后一个记录交换 Heapify(R,1,i-1); //将R[1..i-1]重新调整为堆,仅有R[1]可能违反堆性质 } } ---------------------------------------Code--------------------------------------

堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。

堆排序的最坏时间复杂度为O(nlgn)。堆排序的平均性能较接近于最坏性能。 由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。 堆排序是就地排序,辅助空间为O(1), 它是不稳定的排序方法。

堆排序与直接插入排序的区别:

直接选择排序中,为了从R[1..n]中选出关键字最小的记录,必须进行n-1次比较,然后在R[2..n]中选出关键字最小的记录,又需要做n-2次比较。事实上,后面的n-2次比较中,有许多比较可能在前面的n-1次比较中已经做过,但由于前一趟排序时未保留这些比较结果,所以后一趟排序时又重复执行了这些比较操作。

堆排序可通过树形结构保存部分比较结果,可减少比较次数。

八、拓扑排序

例 :学生选修课排课先后顺序

拓扑排序:把有向图中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程。

方法:

在有向图中选一个没有前驱的顶点且输出

从图中删除该顶点和所有以它为尾的弧

重复上述两步,直至全部顶点均已输出(拓扑排序成功),或者当图中不存在无前驱的顶点(图中有回路)为止。

---------------------------------------Code--------------------------------------

void TopologicalSort()/*输出拓扑排序函数。若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR*/

{

int indegree[M];

int i,k,j;

char n;

int count=0;

Stack thestack;

FindInDegree(G,indegree);//对各顶点求入度indegree[0....num]

InitStack(thestack);//初始化栈

for(i=0;iG.num;i++)

Console.WriteLine("结点"+G.vertices[i].data+"的入度为"+indegree[i]);

for(i=0;iG.num;i++)

{

if(indegree[i]==0)

Push(thestack.vertices[i]);

}

Console.Write("拓扑排序输出顺序为:");

while(thestack.Peek()!=null)

{

Pop(thestack.Peek());

j=locatevex(G,n);

if (j==-2)

{

Console.WriteLine("发生错误,程序结束。");

exit();

}

Console.Write(G.vertices[j].data);

count++;

for(p=G.vertices[j].firstarc;p!=NULL;p=p.nextarc)

{

k=p.adjvex;

if (!(--indegree[k]))

Push(G.vertices[k]);

}

}

if (countG.num)

Cosole.WriteLine("该图有环,出现错误,无法排序。");

else

Console.WriteLine("排序成功。");

}

----------------------------------------Code--------------------------------------

算法的时间复杂度O(n+e)。

java中的算法,一共有多少种,哪几种,怎么分类。

就好比问,汉语中常用写作方法有多少种,怎么分类。

算法按用途分,体现设计目的、有什么特点

算法按实现方式分,有递归、迭代、平行、序列、过程、确定、不确定等等

算法按设计范型分,有分治、动态、贪心、线性、图论、简化等等

作为图灵完备的语言,理论上”Java语言“可以实现所有算法。

“Java的标准库'中用了一些常用数据结构和相关算法.

像apache common这样的java库中又提供了一些通用的算法

java中常用的算法,有哪些?告诉我名字就可以了。越多越好

插入排序 选择排序 冒泡排序 快速排序 归并排序 希尔排序 堆排序 桶式排序 基数排序 前面几个常用点吧 不过我这种低级程序员 都用的不多 哎

哪些JAVA项目开发里会用到算法比较多

一般用java写c/s用的算法比较多

然后大型的项目涉及到性能的时候,算法也要占很大一部分

现在web项目 用到了很多框架 很多的算法就在框架里面帮你实现了 你只要调用就行

你可以去看看开源框架的源码

如何用java实现最大边际相关算法mmr算法

可以使用冒泡排序,最值在两端(得到最大值和最小值),多少个数字都不是问题

int score[] = {20, 50, 15, 66, 35, 40, 80, 67};

for (int i = 0; i score.length -1; i++){

for(int j = 0 ;j score.length - i - 1; j++){

if(score[j] score[j + 1]){

int temp = score[j];

score[j] = score[j + 1];

score[j + 1] = temp;

}

}

System.out.print("第" + (i + 1) + "次排序结果:");

for(int a = 0; a score.length; a++){

System.out.print(score[a] + "\t");

}

System.out.println("");

}

System.out.print("最终排序结果:");

for(int a = 0; a score.length; a++){

System.out.print(score[a] + "\t");

}

System.out.println();

System.out.println("最大值:"+score[0]);

System.out.println("最小值:"+score[score.length-1]);

关于java用的最多的算法和java对算法要求高吗的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-22,除非注明,否则均为首码项目网原创文章,转载请注明出处。