前pre(root)
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),平南企業(yè)網(wǎng)站建設(shè),平南品牌網(wǎng)站建設(shè),網(wǎng)站定制,平南網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,平南網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
{ if(root==null)return null;
visit(root);pre(root.left);pre(root.right);
}
中in(root)
{ if(root==null)return null;
in(root.left);visit(root);in(root.right);
}
后post(root)
{ if(root==null)return null;
post(root.left);post(root.right);visit(root);
}
給你介紹4種排序方法及源碼,供參考
1.冒泡排序
主要思路: 從前往后依次交換兩個(gè)相鄰的元素,大的交換到后面,這樣每次大的數(shù)據(jù)就到后面,每一次遍歷,最大的數(shù)據(jù)到達(dá)最后面,時(shí)間復(fù)雜度是O(n^2)。
public?static?void?bubbleSort(int[]?arr){
for(int?i?=0;?i??arr.length?-?1;?i++){
for(int?j=0;?j??arr.length-1;?j++){
if(arr[j]??arr[j+1]){
arr[j]?=?arr[j]^arr[j+1];
arr[j+1]?=?arr[j]^arr[j+1];
arr[j]?=?arr[j]^arr[j+1];
}
}
}
}
2.選擇排序
主要思路:每次遍歷序列,從中選取最小的元素放到最前面,n次選擇后,前面就都是最小元素的排列了,時(shí)間復(fù)雜度是O(n^2)。
public?static?void?selectSort(int[]?arr){
for(int?i?=?0;?i?arr.length?-1;?i++){
for(int?j?=?i+1;?j??arr.length;?j++){
if(arr[j]??arr[i]){
arr[j]?=?arr[j]^arr[i];
arr[i]?=?arr[j]^arr[i];
arr[j]?=?arr[j]^arr[i];
}
}
}
}
3.插入排序
主要思路:使用了兩層嵌套循環(huán),逐個(gè)處理待排序的記錄。每個(gè)記錄與前面已經(jīng)排好序的記錄序列進(jìn)行比較,并將其插入到合適的位置,時(shí)間復(fù)雜度是O(n^2)。
public?static?void?insertionSort(int[]?arr){
int?j;
for(int?p?=?1;?p??arr.length;?p++){
int?temp?=?arr[p];???//保存要插入的數(shù)據(jù)
//將無(wú)序中的數(shù)和前面有序的數(shù)據(jù)相比,將比它大的數(shù),向后移動(dòng)
for(j=p;?j0??temp?arr[j-1];?j--){
arr[j]?=?arr[j-1];
}
//正確的位置設(shè)置成保存的數(shù)據(jù)
arr[j]?=?temp;
}
}
4.希爾排序
主要思路:用步長(zhǎng)分組,每個(gè)分組進(jìn)行插入排序,再慢慢減小步長(zhǎng),當(dāng)步長(zhǎng)為1的時(shí)候完成一次插入排序,? 希爾排序的時(shí)間復(fù)雜度是:O(nlogn)~O(n2),平均時(shí)間復(fù)雜度大致是O(n^1.5)
public?static?void?shellSort(int[]?arr){
int?j?;
for(int?gap?=?arr.length/2;?gap??0?;?gap/=2){
for(int?i?=?gap;?i??arr.length;?i++){
int?temp?=?arr[i];
for(j?=?i;?j=gap??temparr[j-gap];?j-=gap){
arr[j]?=?arr[j-gap];
}
arr[j]?=?temp;
}
}
}
java Map 遍歷一般有四種方式
方式一: 這是最常見(jiàn)的并且在大多數(shù)情況下也是最可取的遍歷方式。在鍵值都需要時(shí)使用。
方式二: 在for-each循環(huán)中遍歷keys或values。
如果只需要map中的鍵或者值,你可以通過(guò)keySet或values來(lái)實(shí)現(xiàn)遍歷,而不是用entrySet。
該方法比entrySet遍歷在性能上稍好(快了10%),而且代碼更加干凈。
方式三:使用Iterator遍歷
使用泛型:
不使用泛型:
你也可以在keySet和values上應(yīng)用同樣的方法。
方法四:? 通過(guò)鍵找值遍歷(效率低)
作為方法一的替代,這個(gè)代碼看上去更加干凈;但實(shí)際上它相當(dāng)慢且無(wú)效率。
因?yàn)閺逆I取值是耗時(shí)的操作(與方法一相比,在不同的Map實(shí)現(xiàn)中該方法慢了20%~200%)。如果安裝了FindBugs,它會(huì)做出檢查并警告你關(guān)于哪些是低效率的遍歷。所以盡量避免使用。
總結(jié):
如果僅需要鍵(keys)或值(values)使用方法二。
如果所使用的語(yǔ)言版本低于java 5,或是打算在遍歷時(shí)刪除entries,必須使用方法三。
否則使用方法一(鍵值都要)。
擴(kuò)展資料:
類(lèi)似的遍歷算法:
二叉樹(shù)的遍歷算法
1、先(根)序遍歷的遞歸算法定義:
若二叉樹(shù)非空,則依次執(zhí)行如下操作:
⑴ 訪(fǎng)問(wèn)根結(jié)點(diǎn);
⑵ 遍歷左子樹(shù);
⑶ 遍歷右子樹(shù)。
2、中(根)序遍歷的遞歸算法定義:
若二叉樹(shù)非空,則依次執(zhí)行如下操作:
⑴遍歷左子樹(shù);
⑵訪(fǎng)問(wèn)根結(jié)點(diǎn);
⑶遍歷右子樹(shù)。
3、后(根)序遍歷得遞歸算法定義:
若二叉樹(shù)非空,則依次執(zhí)行如下操作:
⑴遍歷左子樹(shù);
⑵遍歷右子樹(shù);
⑶訪(fǎng)問(wèn)根結(jié)點(diǎn)。
參考資料:百度百科——Java
既然在學(xué)數(shù)據(jù)結(jié)構(gòu),那就用二叉樹(shù)排序吧,一個(gè)根節(jié)點(diǎn),比根節(jié)點(diǎn)小的排左邊,比根節(jié)點(diǎn)大的排右邊,以此類(lèi)推,形成二叉樹(shù),再遍歷輸出即可。這個(gè)例子掌握了,你就多學(xué)了一種數(shù)據(jù)結(jié)構(gòu)
class BinaryTree
{
class Node
{
private int data; //保存數(shù)據(jù)內(nèi)容
private Node left; //左子樹(shù)
private Node right;//右子樹(shù)
public Node(int data){
this.data = data;
}
public void addNode(Node newNode){ //addNode方法用來(lái)添加數(shù)據(jù)
if(newNode.data = this.data){
if(this.left == null){ //左子樹(shù)為空
this.left = newNode;
}else{
this.left.addNode(newNode);//繼續(xù)向下判斷
}
}
if(newNode.data this.data){
if(this.right == null){ //右子樹(shù)為空
this.right = newNode;
}else{
this.right.addNode(newNode);//繼續(xù)向下判斷
}
}
} //addNode方法結(jié)束
public void printNode(){ //采用中序遍歷(左-根-右)
if(this.left != null){
this.left.printNode();
}
System.out.println(this.data); //找到根內(nèi)容
if(this.right != null){
this.right.printNode();
}
}
} //Node類(lèi)結(jié)束
private Node root; //根節(jié)點(diǎn)
public void add(int data){
Node newNode = new Node(data);
if(this.root == null){
this.root = newNode;
}else{
this.root.addNode(newNode);
}
}
public void print(){
this.root.printNode();
}
}
public class Demo
{
public static void main(String args[]){
BinaryTree bt = new BinaryTree();
bt.add(3);
bt.add(4);
bt.add(0);
bt.add(1);//可添加100個(gè)數(shù)據(jù),也可通過(guò)args[]手動(dòng)輸入,需略做調(diào)整
bt.print();
}
}