首页编程java编程java数据结构与算法(java数据结构与算法pdf)

java数据结构与算法(java数据结构与算法pdf)

编程之家2026-06-031181次浏览

今天给各位分享java数据结构与算法的知识,其中也会对java数据结构与算法pdf进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

java数据结构与算法(java数据结构与算法pdf)

Java算法与数据结构代码

第1题:我给你搭建算法框架,具体需求,你只需往里面写Code即可:

publicclassProgram{

privatestaticfinalintN=6;

publicstaticvoidmain(String[]args){

Nodehead=newNode(-1,null);//定义头指针,带头结点的单链表

for(inti=0;i<N;i++){

java数据结构与算法(java数据结构与算法pdf)

Nodee=newNode(i+1,null);

tailInsert(head,e);

}

//Test

Nodep=head;

while(p.getNext()!=null){

java数据结构与算法(java数据结构与算法pdf)

p=p.getNext();

}

}

/**

*@paramhead实施尾插法算法的单链表头指针

*@parame所需的元素

*/

privatestaticvoidtailInsert(Nodehead,Nodee){

Nodep=head;

while(p.getNext()!=null){

p=p.getNext();//寻访单链表,直至到达单链表末尾

}

//实施尾插法

p.setNext(e);

}

}

classNode{

privateintid;//编号

privateNodenext;//单链表后继指针

privateStringvote;//选票

publicNode(){}

publicNode(intid,Nodenext){

super();

this.id=id;

this.next=next;

}

publicNode(intid,Nodenext,Stringvote){

super();

this.id=id;

this.next=next;

this.vote=vote;

}

@Override

publicStringtoString(){

return"Node[id="+id+",next="+next+"]";

}

publicintgetId(){

returnid;

}

publicvoidsetId(intid){

this.id=id;

}

publicNodegetNext(){

returnnext;

}

publicvoidsetNext(Nodenext){

this.next=next;

}

}第2题:参看我以前的回答:

算法思想已经写的清楚得不能在清楚了。转成Java就是小菜一碟。

Java 与 算法+数据结构 (100分)

说数据结构没用那是不可能的,但是要看你做什么了。

比如说你要血java,如果你想搞网站方面的话就简单了。

数据结构基本可以不用学,因为在web应用中,能用到的算法的地方少之又少,几乎就那么几个,想记不住都难。

但是如果你要往软件方面和手软方面发展的话就要学一部分了,但是这东西学是学不到的,能学到的只不过是思路,到时候自己发挥一下,想个算法就行了,算法这东西说难不难,难的东西有,但是没有你能用到的。

像你这样的情况我想说两点:

首先,说你想从事算法类的工作,那么选择什么样的语言都是一样的,算法肯定有,但是用到的都不多。刚进公司的时候一般是用不到算法的,因为算法都是别人想的,你也许有好的算法,但是别人不一定采用,但是你的算法基础不要丢掉,因为等你当了项目经理后这个是必不可少的。

其次,你要知道,在学计算机的路上,很少有人能学什么就做什么,大家都在被社会潮流推动,想要不掉队就只能随波逐流。因为毕竟我们都不想一辈子写代码。大家都是拿这东西做个跳板。

学java的路很长,但是也很有趣,希望你能学好。我想以你的算法基础,以后想成为专业精英不是问题。加油吧。

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

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

(1)执行时间

(2)存储空间

(3)编程工作

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

主要排序法有:

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

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

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

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

五、归并排序

六、快速排序

七、堆排序

八、拓扑排序

一、冒泡(Bubble)排序

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

void BubbleSortArray()

{

for(int i=1;i<n;i++)

{

for(int j=0;i<n-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;i<n-1;i++)

{

min_index=i;

for(int j=i+1;j<n;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;i<n;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;incr<0;incr--)//增量递减,以增量3,2,1为例

{

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

{

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

{

int temp=arr[i];

int j=i-incr;

while(j>=0&&arr[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;z<high-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+1>kj,则令j=j+1,否则j不变;

(5)比较temp和kj,若kj>temp,则令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;i>1;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;i<G.num;i++)

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

for(i=0;i<G.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(count<G.num)

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

else

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

}

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

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

关于java数据结构与算法到此分享完毕,希望能帮助到您。

ai数据分析软件 推荐一款功能强大的ai数据分析工具eclipse使用教程jsp eclipse可以写jsp吗