Java常用數據結構和算法
阿新 • • 發佈:2018-08-26
調用 spa dem tor mod bsp 索引 start 如果 就能達到平衡,實現起來也更為簡單。
二叉樹:
1、每個結點不能多於兩個子樹;
2、一顆平衡二叉樹的深度要比及結點個數N小得多。
二叉查找樹:
1、結點x的所有左子樹的值小於x,所有右子樹的值大於x;
AVL樹:
1、一種帶有平衡條件的二叉查找樹;
2、每個結點的左子樹和右子樹深度最多差1。
紅黑樹:
1、樹的顏色只能為紅色或黑色的一種平衡二叉樹;
2、樹的根結點和葉子結點必須為黑色;
3、紅色結點的子結點必須為黑色,且必存在;
4、任一結點到其每個葉子結點黑色的結點樹相同;
5、從根到葉子的最長的可能路徑不多於最短的可能路徑的兩倍長
紅黑樹與平衡二叉樹:
紅黑樹放棄了追求完全平衡,追求大致平衡,在與平衡二叉樹的時間復雜度相差不大的情況下,保證每次插入最多只需要三次旋轉
平衡二叉樹又被稱為AVL樹
紅黑樹有更好的效率,更高的統計性能
雞尾酒排序:
<wiz_code_mirror>private static void sort(int[] arrys) {
int tmp = 0;
for (int i = 0; i < arrys.length/2; i++) {
boolean isSorted = true;
for (int j = i; j < arrys.length-i-1; j++) {
if(arrys[j]>arrys[j+1]){
tmp = arrys[j];
arrys[j] = arrys[j+1];
arrys[j+1] = tmp;
isSorted = false;
}
}
if(isSorted){
break;
}
isSorted = true;
for (int j = arrys.length-i-1; j > i; j--) {
if(arrys[j]<arrys[j-1]){
tmp = arrys[j];
arrys[j] = arrys[j-1];
arrys[j-1] = tmp;
isSorted = false;
}
}
if(isSorted){
break;
}
}
}
快速排序:
<wiz_code_mirror>
private static void sort(int[] arrys,int low, int high) {
int start = low;
int end = high;
int key = arrys[start];
while(end>start){
while(end>start&&arrys[end] >= key)//如果沒有比關鍵值小的,比較下一個,直到有比關鍵值小的交換位置,然後又從前往後比較
end--;
if(key >= arrys[end]){
int tmp = arrys[end];
arrys[end] = arrys[start];
arrys[start] = tmp;
}
while(end>start&&key >= arrys[start])
start++;
if(arrys[start] >= key){
int tmp = arrys[end];
arrys[end] = arrys[start];
arrys[start] = tmp;
}
//此時第一次循環比較結束,關鍵值的位置已經確定了。左邊的值都比關鍵值小,右邊的值都比關鍵值大,但是兩邊的順序還有可能是不一樣的,進行下面的遞歸調用
}
if(start > low){
sort(arrys, low, start-1);//左邊序列。第一個索引位置到關鍵值索引-1
}
if(high>end){
sort(arrys, end+1, high);//右邊序列。從關鍵值索引+1到最後一個
}
}
Java常用數據結構和算法