当前位置:首页 » 编程语言 » java数据结构算法

java数据结构算法

发布时间: 2022-09-25 22:54:15

① 自学java数据结构对C语言数据结构有帮助吗

有的,数据结构不区分语言。用什么语言都可以,但是java是完全面向对象的语言,写数据结构的时候可能比较繁琐,建议还是使用c或c++语言来学习。
而且一般来说掌握几门语言是很正常的,只是学个语法基本上花个几天看一看就足够了。编程重在逻辑,语言只是次要的

② Java面试笔试,数据结构和算法考到什么程度

你说的那个数据结构不一定考的。
Java面试就那么点东西,各个公司也不一样。
有的分笔试和机试。这些公司想看看实际面试人员的能力,节省了以后的时候。
笔试中,无非就是一些概念性的东西巴了。
比如:jsp是servlet吗?
servlet的生存周期;还有一些面向对象的知识。这些平常用心的话都没问题,即使临阵磨枪也行。
那么机试就的要看你自己的能力了,对框架的属性程度。还有就是在也不能常见的对数据
库的CRUD也就是增删改查操作。机试都好这口。
其实面试如果也没笔试机试那么就问几道题的话,如果是技术人,几道题下来就知道你的底子了,在问些逻辑上的也就知道要你还是不要你了。
在有你要对一些数据库知识了解一些。
做java的
oracle
得达到掌握
sql
server
了解就行
基本语法啥的就可以了
mysql
这个也得达到掌握
别的就不要会用到

③ 求JAVA.数据结构.算法学习视频百度云。

《数据结构课程精讲教案合集-复旦大学(共计1061页).pdf 》网络网盘免费资源下载

链接: https://pan..com/s/15uwjtHgKKzZdheWFQC21pQ

?pwd=abzc 提取码: abzc

④ java(算法与数据结构)tree

代码实现[一]部分
package ChapterEight;

class Tree {
class Node {
public long value;

public Node leftChild;

public Node rightChild;

public Node(long value) {
this.value = value;
leftChild = null;
rightChild = null;
}
}

public Node root;

public Tree() {
root = null;
}

// 向树中插入一个节点
public void insert(long value) {
Node newNode = new Node(value);
// 树是空的
if (root == null)
root = newNode;
else {
Node current = root;
Node parentNode;
while (true) {
parentNode = current;
if (value < current.value) {
current = current.leftChild;
// 要插入的节点为左孩子节点
if (current == null) {
parentNode.leftChild = newNode;
return;
}
} else {
// 要插入的节点为右孩子节点
current = current.rightChild;
if (current == null) {
parentNode.rightChild = newNode;
return;
}
}
}
}
}

// 先续遍历树中的所有节点
public void preOrder(Node currentRoot) {
if (currentRoot != null) {
System.out.print(currentRoot.value + " ");
preOrder(currentRoot.leftChild);
preOrder(currentRoot.rightChild);
}
}

// 中续遍历树中的所有节点
public void inOrder(Node currentNode) {
if (currentNode != null) {
inOrder(currentNode.leftChild);
System.out.print(currentNode.value + " ");
inOrder(currentNode.rightChild);
}
}

// 后续遍历树中的所有节点
public void postOrder(Node currentNode) {
if (currentNode != null) {
postOrder(currentNode.leftChild);
postOrder(currentNode.rightChild);
System.out.print(currentNode.value + " ");
}
}

public void traverse(int traverseType) {
switch (traverseType) {
case 1:
preOrder(root);
break;
case 2:
inOrder(root);
break;
case 3:
postOrder(root);
break;
default:
break;
}
// 依据树节点的值删除树中的一个节点
public boolean delete(int value) {
// 遍历树过程中的当前节点
Node current = root;
// 要删除节点的父节点
Node parent = root;
// 记录树的节点为左孩子节点或右孩子节点
boolean isLeftChild = true;
while (current.value != value) {
parent = current;
// 要删除的节点在当前节点的左子树里
if (value < current.value) {
isLeftChild = true;
current = current.leftChild;
}
// 要删除的节点在当前节点的右子树里
else {
isLeftChild = false;
current = current.rightChild;
}
// 在树中没有找到要删除的节点
if (current == null)
return false;
}
// 要删除的节点为叶子节点
if (current.leftChild == null && current.rightChild == null) {
// 要删除的节点为根节点
if (current == root)
root = null;
// 要删除的节点为左孩子节点
else if (isLeftChild)
parent.leftChild = null;
// 要删除的节点为右孩子节点
else
parent.rightChild = null;
}
// 要删除的节点有左孩子节点,没有右孩子节点
else if (current.rightChild == null) {
// 要删除的节点为根节点
if (current == null)
root = current.leftChild;
// 要删除的节点为左孩子节点
else if (isLeftChild)
parent.leftChild = current.leftChild;
// 要删除的节点为右孩子节点
else
parent.rightChild = current.leftChild;
}
// 要删除的节点没有左孩子节点,有右孩子节点
else if (current.leftChild == null) {
// 要删除的节点为根节点
if (current == root)
root = root.rightChild;
// 要删除的节点为左孩子节点
else if (isLeftChild)
parent.leftChild = current.rightChild;
// 要删除的节点为右孩子节点
else
parent.rightChild = current.rightChild;
}
// 要删除的接节点既有左孩子节点又有右孩子节点
else {
Node successor = getSuccessor(current);
// 要删除的节点为根节点
if (current == root)
root = successor;
// 要删除的节点为左孩子节点
else if (isLeftChild)
parent.leftChild = successor;
// 要删除的节点为右孩子节点
else
parent.rightChild = successor;
}
return true;
}

// 找到要删除节点的替补节点
private Node getSuccessor(Node delNode) {
// 替补节点的父节点
Node successorParent = delNode;
// 删除节点的替补节点
Node successor = delNode;
Node current = delNode.rightChild;
while (current != null) {
// successorParent指向当前节点的上一个节点
successorParent = successor;
// successor变为当前节点
successor = current;
current = current.leftChild;
}
// 替补节点的右孩子节点不为空
if (successor != delNode.rightChild) {
successorParent.leftChild = successor.rightChild;
successor.rightChild = delNode.rightChild;
}
return successor;
}
}

public class TreeApp {
public static void main(String[] args) {
Tree tree = new Tree();
tree.insert(8);
tree.insert(50);
tree.insert(45);
tree.insert(21);
tree.insert(32);
tree.insert(18);
tree.insert(37);
tree.insert(64);
tree.insert(88);
tree.insert(5);
tree.insert(4);
tree.insert(7);

System.out.print("PreOrder : ");
tree.traverse(1);
System.out.println();

System.out.print("InOrder : ");
tree.traverse(2);
System.out.println();

System.out.print("PostOrder : ");
tree.traverse(3);
System.out.println();

System.out.println(tree.delete(7));

System.out.print("PreOrder : ");
tree.traverse(1);
System.out.println();

System.out.print("InOrder : ");
tree.traverse(2);
System.out.println();

System.out.print("PostOrder : ");
tree.traverse(3);
System.out.println();

}
}

⑤ java数据结构---折半查找的递归算法,望高手指点!

package souce;

public class Search {

public static boolean binarySearch(int[] a,int x,int left,int right){//二分查找的主方法
if(x==a[left]||x==a[right])return true; //找到,返回真
if(right-left<2)return false; //可找元素小于3,由上一步说明没有,返回假
int mid = (left+right)/2; //否则:二分
if(x==a[mid])return true; //中间元素OK,返回OK
else{ //否则
if(x>a[mid])return binarySearch(a,x,mid+1,right);//大于中间元素找右半部分
else return binarySearch(a,x,left,mid-1); //小于中间元素找左半部分
}
}

public static final int[] sort(int[] a){ //int数组 的 排序方法
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
if(a[i]<a[j]){
swap(a,i,j);
}
}

}
return a;
}

private static void swap(int[] a, int i, int j) { //数组元素交换子函数
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}

public static void print(int[] a){ //打印函数
System.out.println();
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
if(i!=a.length-1)System.out.print(",");
}
System.out.println();
}

public static void main(String[] args) { //测试方法
int[] a = {90, 12, 21, 32, 51, 78, 87, 98};
print(sort(a));
System.out.println(binarySearch(sort(a), 40, 0, a.length-1));
}
}

⑥ 数据结构与算法分析,c,c++,java版 之间的区别是什么

数据结构与算法分析和具体的语言之间没有关系,一般算法都是用伪代码写的,类Pascal语言,推荐楼主看数据结构与算法分析是不要看C,C++,JAVA版这一类的。

⑦ 新手初学Java有必要去学习数据结构与算法吗

还是有些必要的,大公司笔试面试基本都是靠计算机网络及数据结构与算法,建议找些基础的算法如排序查找等入门就可以了,java新人用不到多深层次的算法。千锋教育就有线上免费Java线上公开课。【更系统全面的学习资料,点击查看】 但是如果是新手小白的话,建议还是报班培训。因为Java自学起来相对比较难,正确的学习资料的获取、学习中遇到的问题以及如何合理运用学到的知识等都是自学中常会遇到的问题,而且解决起来都比较花费时间,而培训机构有系统的教学体系和经验丰富的讲师,而且学习氛围很浓厚,相对自学而言会更容易一些。千锋教育就有线上免费Java线上公开课。但是要注意的是Java的培训机构良莠不齐,很多培训机构的目的其实就是赚钱,只管教,对学员是否学会并不关心。所以在选择培训机构的时候一定要慎重,要选择口碑良好、师资团队优秀、教学内容与时俱进的培训机构。综上自学Java要一年以上才能达到做项目的程度,而通过培训的话一般六个月左右就能达到做项目的程度。如果想了解Java更多相关知识,建议到千锋教育了解一下。千锋教育目前在18个城市拥有22个校区,年培养优质人才20000余人,与国内20000余家企业建立人才输送合作关系,院校合作超600所。【千锋IT培训机构,热门IT课程试听名额限时领取】

⑧ 数据结构 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)。

热点内容
android设置状态栏的颜色 发布:2024-12-30 03:22:38 浏览:274
魅蓝e2存储卡 发布:2024-12-30 03:21:57 浏览:400
sql语句中if的用法 发布:2024-12-30 03:21:48 浏览:630
配置化疗药物怎么戴手套 发布:2024-12-30 03:20:22 浏览:639
编译apache 发布:2024-12-30 03:11:50 浏览:954
编程教程入门 发布:2024-12-30 03:08:22 浏览:447
怎么录阴阳师视频安卓 发布:2024-12-30 03:06:55 浏览:393
安卓6s手机怎么清内存垃圾 发布:2024-12-30 03:01:14 浏览:434
百度贴吧文件夹 发布:2024-12-30 02:59:47 浏览:97
java开发人员 发布:2024-12-30 02:26:17 浏览:537