Shell排序和二叉树排序

Shell排序

#include<iostream>

using namespace std;
void Print(int *list, int len);
void ShellSort(int *list, int *list2, int len, int gap);


void ShellSort(int *list, int *list2, int len, int gap) {
int cc = len / gap + (len%gap != 0);
int l = 0;
for (int i = 0; i < gap; i++) {
for (int c = 0; c < cc; c++) {
for (int j = i; j + gap < len; j += gap) {
if (list[j] > list[j + gap]) {
int t = list[j];
list[j] = list[j + gap];
list[j + gap] = t;
}
}
}
for (int k = i; k < len; l++, k += gap) {
list2[l] = list[k];
}
}
Print(list, len);
}
void Print(int *list, int len) {
for (int i = 0; i < len; i++) {
cout << list[i];
}
cout << endl;
}
int main()
{
int list[] = { 3,7,1,9,4,6,8,5,2,0 };
int list2[10] = { 0 };
ShellSort(list, list2, 10, 5);
ShellSort(list2, list, 10, 2);
ShellSort(list, list2, 10, 1);
return 0;
}

代码写的可以说有一点点丑= =

二叉树排序

//需要一个栈,用数组写了= =

#include "stdafx.h"
#include<iostream>
using namespace std;

class Node {
private:
int data;
Node *left;
Node *right;
public:
Node():data(0),left(NULL),right(NULL){}
Node(int d):data(d), left(NULL), right(NULL) {}
void SetData(int d) { data = d; }
void SetLeft(Node *l) { left = l; }
void SetRight(Node *r) { right = r; }
int GetData() { return data; }
Node *GetLeft() { return left; }
Node *GetRight() { return right; }
};

class Tree {
private:
Node *root;
Node *stack[20];
int pstack;
void AppendNode(Node* root, int d);
void PrintTree(Node *root, int isFromStack);
public:
Tree() :root(NULL) { pstack = -1; }
Tree(int d) { root = new Node(d); pstack = -1; }
~Tree(){}
void AppendNode(int d) { AppendNode(root, d); }//重载一下方便外部调用
void PrintTree() { PrintTree(root, 0); }
void Push(Node *n) { 
if (++pstack < 20)
stack[pstack] = n;
else pstack--; 
}
Node *Pop() { 
//cout << endl << "Stack: " << pstack << endl;
if (pstack == -1) 
return NULL;
pstack--;
return stack[pstack + 1];
}
};
void Tree::PrintTree(Node *root, int isFromStack) {
if (root == NULL) { //走到尽头了,出栈
Node *t = Pop();
if (t != NULL) {
PrintTree(t, 1);
}// else { return; }//我也不知道这样写为啥不对,写在外面就好了,单步了发现没跳出去,很奇怪
return;
}
if (root->GetLeft() != NULL && isFromStack == 0) { //左子树不空,当前节点压栈,往左走,若是弹栈得到的,则不管左面
Push(root);
PrintTree(root->GetLeft(), 0);
} else { //左子树为空,输出当前节点,判断右面
cout << root->GetData();
PrintTree(root->GetRight(), 0);
}
}
void Tree::AppendNode(Node* root, int d) {
if (root == NULL) { return; } else {
if (d == root->GetData()) { return; }
if (d > root->GetData()) { //新值比当前大
if (root->GetRight() == NULL) { //右面没有节点,建新节点,建新链接
Node *newnode = new Node(d);
root->SetRight(newnode);
} else { //右面有节点,往右走
AppendNode(root->GetRight(), d);
}
}
if (d < root->GetData()) {
if (root->GetLeft() == NULL) {
Node *newnode = new Node(d);
root->SetLeft(newnode);
} else {
AppendNode(root->GetLeft(), d);
}
}

}
}
int main()
{
Tree t = Tree(3);
t.AppendNode(7);
t.AppendNode(1);
t.AppendNode(9);
t.AppendNode(4);
t.AppendNode(6);
t.AppendNode(8);
t.AppendNode(5);
t.AppendNode(2);
t.AppendNode(0);
t.PrintTree();
return 0;
}

这个还是有点麻烦的,写了一个二叉树类和一个节点类,二叉树的话包括插入节点(中序)和打印树(中序),两个都是用递归写的,递归真厉害。

缺点是建树的时候必须创建根节点,也就是那个无参构造函数不能用,否则会出错(指针用的还不够熟啊)

还有没写析构函数,懒得写了

还有啊,栈是用数组写的,最大二十(这么个东西我再拿类写个栈真的是要死了)

节点的SetData()方法根据需要决定是否去掉

原文地址:http://www.cnblogs.com/ippfcox/p/7401820.html 转载请注明

原文地址:https://www.cnblogs.com/ippfcox/p/7401820.html