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 转载请注明

时间: 2024-11-10 07:27:32

Shell排序和二叉树排序的相关文章

二叉树排序

二叉树排序 // 二叉树排序.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> #include<stdlib.h> #include<windows.h> struct data{ int num; struct data* lbaby, *rbaby; }*root, *tree, *leaf; void find(int,struct data*); void outpu

6. 蛤蟆的数据结构进阶六之二叉树排序树

6. 蛤蟆的数据结构进阶六之二叉树排序树 本篇名言:"有些人因为贪婪,想得更多的东西,却把现在所有的也失掉了. -- 伊索" 关于理论知识已经在上篇中进行描述,这篇我们主要来看下如何是实现二叉排序树. 欢迎转载,转载请标明出处: 1.  二叉排序树的定义 二叉排序树(BinarySort Tree)又称二叉查找(搜索)树(Binary Search Tree).其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树: ①若它的左子树非空,则左子树上所有结点的值均小于根结点的值: ②

二叉树的应用(1)--二叉树排序树基本操作

#include <cstdio> struct BSTNode { int m_nval; //数据域 BSTNode *m_pleft; // 左孩子节点 BSTNode *m_pright; //右孩子节点 }; /************************************************************************ 功能:在二叉排序树中 查找key值,如果找到,返回true,且plast指向该节点. plastfahter指向该双双亲节点.如果

二叉树排序树的的构造和查找

/********************************************************* 二叉树排序树的的构造和查找 *********************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <stack&g

数据结构实践——二叉树排序树中查找的路径

本文是[数据结构基础系列(8):查找]中的实践项目参考. [项目 - 二叉树排序树中查找的路径] 设计一个算法,输出在二叉排序中查找时查找某个关键字经过的路径. [参考解答] 专为本项目设计的算法体现在函数int SearchBST(-)和void SearchResult()中. #include <stdio.h> #include <malloc.h> #define MaxSize 100 typedef int KeyType; //定义关键字类型 typedef cha

经典排序算法 - 希尔排序Shell sort

经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每

使用Integer类实现二叉树排序

class BinaryTree {     class Node {         private Comparable data;         private Node left;         private Node right;         public void addNode(Node newNode) {             if (newNode.data.compareTo(this.data) < 0) {                 if (this.

排序算法——希尔排序

希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 该方法因DL.Shell于1959年提出而得名. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多, 当增量减至1时,整个文件恰被分成一组,算法便终止. 代码实现 void shellsort(int a[],int n) { int gap=0,i=0,temp=0,j=0; for(

希尔排序和高速排序

//希尔排序 在直接插入排序算法中,每次插入一个数,使有序序列仅仅添加1个节点,而且对插入下一个数没有提供不论什么帮助. 假设比較相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比較就可能消除多个元素交换. D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想.算法先将要排序的一组数按某个增量d分成若干组, 每组中记录的下标相差d.对每组中所有元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序. 当增量减到1时,整个要排序的数被分成一组,排序完