java數據結構演算法
① 自學java數據結構對C語言數據結構有幫助嗎
有的,數據結構不區分語言。用什麼語言都可以,但是java是完全面向對象的語言,寫數據結構的時候可能比較繁瑣,建議還是使用c或c++語言來學習。
而且一般來說掌握幾門語言是很正常的,只是學個語法基本上花個幾天看一看就足夠了。編程重在邏輯,語言只是次要的
② Java面試筆試,數據結構和演算法考到什麼程度
你說的那個數據結構不一定考的。
Java面試就那麼點東西,各個公司也不一樣。
有的分筆試和機試。這些公司想看看實際面試人員的能力,節省了以後的時候。
筆試中,無非就是一些概念性的東西巴了。
比如:jsp是servlet嗎?
servlet的生存周期;還有一些面向對象的知識。這些平常用心的話都沒問題,即使臨陣磨槍也行。
那麼機試就的要看你自己的能力了,對框架的屬性程度。還有就是在也不能常見的對數據
庫的CRUD也就是增刪改查操作。機試都好這口。
其實面試如果也沒筆試機試那麼就問幾道題的話,如果是技術人,幾道題下來就知道你的底子了,在問些邏輯上的也就知道要你還是不要你了。
在有你要對一些資料庫知識了解一些。
做java的
oracle
得達到掌握
sql
server
了解就行
基本語法啥的就可以了
mysql
這個也得達到掌握
別的就不要會用到
③ 求JAVA.數據結構.演算法學習視頻百度雲。
《數據結構課程精講教案合集-復旦大學(共計1061頁).pdf 》網路網盤免費資源下載
鏈接: https://pan..com/s/15uwjtHgKKzZdheWFQC21pQ
④ 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)。