使用B樹進行排序的C++程式
在這裡,我們將學習如何使用B樹獲取排序後的序列。B樹是n元樹。為了獲得排序後的序列,我們可以建立一個B樹,然後將數字新增到其中。這裡的B樹最多可以容納5個節點。如果節點數量增加,則分割節點並形成新的層級。由於節點最多隻包含少量元素(例如5個),我們使用氣泡排序技術對其進行排序。由於元素數量非常少,因此不會對效能造成太大影響。
遍歷樹之後,我們將獲得不同節點的所有值。這些元素將按非遞減順序排序。
演算法
traverse(p)
輸入:樹節點p
輸出:樹的遍歷序列
Begin for i in range 0 to n-1, do if p is not a leaf node, then traverse(child of p at position i) end if print the data at position i done if p is not a leaf node, then traverse(child of p at position i) end if End
sort(a, n)
輸入:待排序的陣列a,陣列中元素的數量n
輸出:排序後的陣列
Begin for i in range 0 to n-1, do for j in range 0 to n-1, do if a[i] > a[j], then swap a[i] and a[j] end if done done End
split_node(x, i)
輸入:要分割的節點x,i對於葉子節點為(-1),否則為某個正值
輸出:節點分割後的中間元素
Begin Create a node np3, and mark it as leaf node if i is -1, then mid := Data from position 2 of x Set the data at position 2 of x to 0 Reduce the number of data in x by 1 create a new node called np1, and mark it as non-leaf node mark x as leaf node Insert all of the nodes of x from position 3 to 5 into np3 Also insert all of the child reference of x from position 3 to 5 into np3 Remove the inserted elements from the node x insert mid into the first position of np1 make x as left child and np3 as right child of np1 increase the element count of np1, and make this as root. else y := the subtree at location i mid := data from position 2 of y Set the data at position 2 of y to 0 Reduce the number of data in y by 1 Insert all of the nodes of y from position 3 to 5 into np3 increase the element count of np3, and remove inserted elements from y add y child at position i, and add np3 at position i+1 end if End
insert(a)
輸入:要插入的元素a。
輸出:更新後的B樹
Begin x := root if x is null, then create a root node and take root into x else if x is leaf node, and has 5 elements, then temp_node := split_child(x, -1) x := root i := find correct position to insert a x := child of x at position i else while x is not a leaf node, do i := find correct position to insert a if child of x at position i, has 5 elements, then temp_node := split_child(x, i) add temp_node data at position x->n of x else x := child of x at position i end if done end if end if add a into x at position x->n sort elements of x End
示例程式碼
#include<iostream>
using namespace std;
struct BTreeNode{ //create a node structure of a B-tree
int *data;
BTreeNode **child_ptr;
bool leaf;
int n;
}*root = NULL, *np = NULL, *x = NULL;
BTreeNode * getNode(){
int i;
np = new BTreeNode;
np->data = new int[5]; //set five data fiels and 6 link field
np->child_ptr = new BTreeNode *[6];
np->leaf = true; //initially the node is a leaf
np->n = 0;
for (i = 0; i < 6; i++) {
np->child_ptr[i] = NULL; //initialize all pointer to null
}
return np;
}
void traverse(BTreeNode *p) {
cout<<endl;
int i;
for (i = 0; i < p->n; i++) { //recursively traverse the entire b-tree
if (p->leaf == false){
traverse(p->child_ptr[i]);
}
cout << " " << p->data[i];
}
if (p->leaf == false) {
traverse(p->child_ptr[i]);
}
cout<<endl;
}
void sort(int *p, int n) {
for (int i = 0; i < n; i++) {
for (int j = i; j <= n; j++) {
if (p[i] > p[j]){
swap(p[i], p[j]);
}
}
}
}
int split_child(BTreeNode *x, int i){ //split the node into three nodes, one root and two children
int mid;
BTreeNode *np1, *np3, *y;
np3 = getNode(); //create a new leaf node called np3
np3->leaf = true;
if (i == -1) {
mid = x->data[2]; //get the middle element
x->data[2] = 0;
x->n--;
np1 = getNode();
np1->leaf = false;
x->leaf = true;
for (int j = 3; j < 5; j++) {
np3->data[j - 3] = x->data[j];
np3->child_ptr[j - 3] = x->child_ptr[j];
np3->n++;
x->data[j] = 0;
x->n--;
}
for (int j = 0; j < 6; j++) {
x->child_ptr[j] = NULL;
}
np1->data[0] = mid;
np1->child_ptr[np1->n] = x;
np1->child_ptr[np1->n + 1] = np3;
np1->n++;
root = np1;
} else {
y = x->child_ptr[i];
mid = y->data[2];
y->data[2] = 0;
y->n--;
for (int j = 3; j < 5; j++) {
np3->data[j - 3] = y->data[j];
np3->n++;
y->data[j] = 0;
y->n--;
}
x->child_ptr[i] = y;
x->child_ptr[i + 1] = np3;
}
return mid;
}
void insert(int a){ //insert into BTree
int i, tmp_node;
x = root;
if (x == NULL) {
root = getNode();
x = root;
} else {
if (x->leaf == true && x->n == 5){ //when the node is a leaf node and has 5 data
tmp_node = split_child(x, -1); //make a new level by spliting the node
x = root;
for (i = 0; i < (x->n); i++) {
if ((a > x->data[i]) && (a < x->data[i + 1])) {
i++;
break;
} else if (a < x->data[0]) {
break;
} else {
continue;
}
}
x = x->child_ptr[i];
} else {
while (x->leaf == false) {
for (i = 0; i < (x->n); i++) {
if ((a > x->data[i]) && (a < x->data[i + 1])) {
i++;
break;
} else if (a < x->data[0]) {
break;
} else {
continue;
}
}
if ((x->child_ptr[i])->n == 5) {
tmp_node = split_child(x, i);
x->data[x->n] = tmp_node;
x->n++;
continue;
} else {
x = x->child_ptr[i];
}
}
}
}
x->data[x->n] = a;
sort(x->data, x->n);
x->n++;
}
int main() {
int i, n, t;
cout<<"enter the no of elements to be inserted\n";
cin>>n;
for(i = 0; i < n; i++) {
cout<<"enter the element\n";
cin>>t;
insert(t);
}
cout<<"traversal of constructed tree\n";
traverse(root);
}輸出
enter the no of elements to be inserted 8 enter the element 54 enter the element 23 enter the element 98 enter the element 52 enter the element 10 enter the element 23 enter the element 47 enter the element 84 traversal of constructed tree 10 23 23 47 52 54 84 98
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP