表排序(思路二)

原创 2016年05月31日 22:10:13
#include <iostream>
#include <iomanip>
#define M 0x7ffffff
#define DefaultSize 100
using namespace std;

template <class T>
void Swap(T &a,T &b)
{
    T t;
    t=a;
    a=b;
    b=t;
    return ;
}
struct Element
{
    char name;
    int price;
    int link;
    Element(char na='\0',int pr=0):name(na),price(pr),link(0){}
    friend ostream& operator<<(ostream &os,Element &x);
};
ostream& operator<<(ostream &os,Element &x)
{
    os<<left<<setw(6)<<x.name<<setw(6)<<x.price<<setw(6)<<x.link<<endl;
    return os;
}

class staticLinkList
{
private:
    Element *Vector;
    int MaxSize,currentSize;
public:
    staticLinkList(int sz=DefaultSize):MaxSize(sz),currentSize(0)
    {
        Vector=new Element[sz];
    }
    ~staticLinkList(){delete []Vector;}
    void Initial();
    void InsertSort();
    void Print();
    void Print1();
    void DeepSort();
};

//初始化创建静态链表
void staticLinkList::Initial()
{
    cout<<"请输入书的总数:";
    int n;
    cin>>n;
    currentSize=n+1;
    if(currentSize>MaxSize-1);
        {
            MaxSize=currentSize+1;
            Vector=new Element[MaxSize+1];
        }
    cout<<"请输入每本书的名称以及其价格:"<<endl;
    Vector[0].name=NULL;

    for(int i=1;i<currentSize;i++)
    {
        cin>>Vector[i].name>>Vector[i].price;   //输入price、name
        Vector[i].link=i;                       //每个元素起始link为i
    }
}

//插入排序,仅仅将各元素link域按price从小到大的顺序链接起来
void staticLinkList::InsertSort()
{
    Vector[0].price=M;
    Vector[0].link=1;
    Vector[1].link=0;                      // 形成只有一个元素的循环链表

    for(int i=2;i<currentSize;i++)
    {
        int p=Vector[0].link;
        int prev=0;                       //p的前驱
        while(Vector[p].price<=Vector[i].price)  //循环找链入位置
        {
            prev=p;
            p=Vector[p].link;
        }
        Vector[prev].link=i;
        Vector[i].link=p;                  //结点i链入prev和p之间
    }
}

//已排好顺序的静态链表的链接顺序,由一个环组成
//按照这个环的顺序对元素进行物理排序
void staticLinkList::DeepSort()
{
    int i=1;
    int head=Vector[0].link;
    Element temp;
    while(head!=0)
    {
        temp=Vector[head];
        Vector[head]=Vector[i];
        Vector[i]=temp;
        Vector[i].link=head;
        head=temp.link;
        i++;
        while(head<i&&head>0) head=Vector[head].link;//i已处理过

    }

}

void staticLinkList::Print()
{
    cout<<left<<setw(6)<<"书名"<<setw(6)<<"价格"<<setw(6)<<"link"<<endl;
    int p=Vector[0].link;
    while(p!=0)
    {
        cout<<Vector[p];
        p=Vector[p].link;
    }
}
void staticLinkList::Print1()
{
    cout<<left<<setw(6)<<"书名"<<setw(6)<<"价格"<<setw(6)<<"link"<<endl;
    for(int i=1;i<currentSize;i++)
        cout<<Vector[i];
}

int main()
{
    staticLinkList sl;
    sl.Initial();
    sl.InsertSort();
    cout<<"只对链接顺序排序后:"<<endl;
    sl.Print();
    sl.DeepSort();
    cout<<"对元素进行物理排序后:"<<endl;
    sl.Print1();

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

链表的二路归并排序 Sort List

对于链表,想找一种时间复杂度为O(nlogn),空间复杂度O(1)的算法。Sort a linked list in O(n log n) time using constant space co...
  • luckyjoy521
  • luckyjoy521
  • 2014年03月12日 13:43
  • 1485

【Java常用排序算法】归并排序(二路归并排序)

归并排序 二路归并排序 Java实现
  • donggua3694857
  • donggua3694857
  • 2017年02月27日 23:17
  • 1615

利用MySQL排序将树结构表数据封装成树结构对象

本人菜鸟一个,望大家多多指教 需求:将具备树结构的线性表遍历出来,得到树形结构的对象 解决思路: 要不查询整条记录,要不查询具备树结构的部分数据。再通过具备树结构的部分数据,将整条记录封装到对象中...
  • xiao123456789jia
  • xiao123456789jia
  • 2016年05月24日 10:38
  • 1437

非中序遍历思路把二元查找树转变成排序的双向链表的分析

(一)把二元查找树转变成排序的双向链表   输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 比如将二元查找树             ...
  • sinat_35125702
  • sinat_35125702
  • 2016年11月02日 21:09
  • 40

表排序(思路一)

//表排序,稳定 //适用于每个元素为一个集合的排序 #include #include #define DefaultSize 100 using namespace std; template...
  • qq1169091731
  • qq1169091731
  • 2016年05月31日 22:07
  • 151

排序 -- 思路简析(二)

简介本篇文章总结一下最近学习的排序算法,提炼出其思想及不同之处。有直接插入排序,希尔排序,选择排序直接插入排序(Insert Sort)每次将无序区的第一个记录按关键字插入到有序区的合适位置,并将有序...
  • Y_ZhiWen
  • Y_ZhiWen
  • 2016年01月03日 10:45
  • 608

二叉搜索树转化为排序双向链表。可以使用中序线索化的方法去进行,在这里需要注意的是我们需要一个记录前一个访问节点的结点。 二叉搜索树转换前: 转换后: 思路:如果根节点的左子树存在,则一直去访

二叉搜索树转化为排序双向链表。可以使用中序线索化的方法去进行,在这里需要注意的是我们需要一个记录前一个访问节点的结点。 二叉搜索树转换前: 转换后: 思路:如果根节点的左子树存在...
  • qq_26668685
  • qq_26668685
  • 2017年08月01日 17:33
  • 86

leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法

Merge k Sorted Lists  Merge k sorted linked lists and return it as one sorted list. Analyze and des...
  • xygy8860
  • xygy8860
  • 2015年07月06日 23:17
  • 485

leetCode 21.Merge Two Sorted Lists (合并排序链表) 解题思路和方法

Merge Two Sorted Lists  Merge two sorted linked lists and return it as a new list. The new list sho...
  • xygy8860
  • xygy8860
  • 2015年07月06日 19:19
  • 679

LeeCode 109.Convert Sorted List to Binary Search Tree(将排序链表转化为BST) 解题思路和方法

Given a singly linked list where elements are sorted in ascending order, convert it to a height bala...
  • xygy8860
  • xygy8860
  • 2015年08月05日 12:47
  • 474
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:表排序(思路二)
举报原因:
原因补充:

(最多只允许输入30个字)