表排序(思路一)

原创 2016年05月31日 22:07:31
//表排序,稳定
//适用于每个元素为一个集合的排序
#include <iostream>
#include <iomanip>
#define DefaultSize 100
using namespace std;
template <class T>
void Swap(T &data1,T &data2)
{
    T t;
    t=data1;
    data1=data2;
    data2=t;
}
//结点定义
struct Element
{
    int price;              //每个元素中的内容集合,假设按照价格排序
    char name;
    int link;
    Element():link(0){}     //构造函数
    Element(int p,char na):price(p),name(na){} //构造函数
    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];}     //构造函数,分配大小为sz的元素空间
    void Initial();
    void Sort();                     //仅仅是将静态链表的链接顺序排序,元素物理顺序并没有改变
    void Print();
    void DeepSort();                 //按照已排好序的静态链表的连接顺序,对所有元素的物理顺序进行排序

};

//初始化创建静态链表
void staticLinkList::Initial()
{
    cout<<"请输入书的总数:";
    int n;
    cin>>n;
    currentSize=n;
    if(currentSize>MaxSize);
        {
            MaxSize=currentSize;
            Vector=new Element[MaxSize];
        }
    cout<<"请输入每本书的名称以及其价格:"<<endl;
    for(int i=0;i<currentSize;i++)
    {
        cin>>Vector[i].name>>Vector[i].price;   //输入price、name
        Vector[i].link=i;                       //每个元素起始link为i
    }
}
//对初始化后的元素按price插入排序
//仅仅是调整链接顺序,并没有调整元素本身的顺序
void staticLinkList::Sort()
{
    int j;
    for(int i=1;i<currentSize;i++)
    {
        j=i;
        if(Vector[Vector[j].link].price<Vector[Vector[j-1].link].price)   //注意比较price时Vector内部索引应为元素内部的link值
        do
        {
            Swap(Vector[j].link,Vector[j-1].link);
            j--;
        }while(j>0&&Vector[Vector[j].link].price<Vector[Vector[j-1].link].price);

    }
}

//原理:已排好序的静态链表中的链接顺序,有若干个独立的环组成
//细节:link[i]=i时,说明元素不用移动,每次移动后,将link[i]改为i
void staticLinkList::DeepSort()
{
     Element *temp;
     int i,p,q;
     temp=new Element;
     for(i=0;i<currentSize;i++)
     {
         if(Vector[i].link!=i)
         {
             p=i;
             q=Vector[p].link;

             //将环的起始位置复制给临时元素
             temp->name=Vector[p].name;
             temp->price=Vector[p].price;

             while(Vector[q].link!=q)
             {
                 Vector[p].name=Vector[q].name;
                 Vector[p].price=Vector[q].price;
                 Vector[p].link=p;
                 p=q;
                 q=Vector[q].link;
             }
             Vector[p].name=temp->name;
             Vector[p].price=temp->price;
             Vector[p].link=p;

         }
     }

}

//按price大小顺序输出元素(从小到大)
//沿着原来的元素顺序,访问的是元素中link指示的元素
void staticLinkList::Print()
{
    int i;
    cout<<left<<setw(6)<<"书名"<<setw(6)<<"价格"<<setw(6)<<"链接"<<endl;
    for(i=0;i<currentSize;i++)
        cout<<Vector[Vector[i].link];
    cout<<endl;
}

/*
a 21
b 15
c 13
d 16
e 22
f 17
*/
int main()
{
    staticLinkList sl;
    sl.Initial();
    cout<<"排序前: "<<endl;
    sl.Print();
    sl.Sort();
    cout<<"只改变链接后排序结果: "<<endl;
    sl.Print();
    sl.DeepSort();                         //对各元素进行物理排序
    cout<<"对元素本身排序结果: "<<endl;
    sl.Print();
    return 0;
}

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

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

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

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...

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...

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...

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

(一)把二元查找树转变成排序的双向链表   输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 比如将二元查找树             ...

排序思路.pdf

  • 2012年09月05日 11:53
  • 771KB
  • 下载

c++排序算法及实现思路

  • 2012年03月18日 11:28
  • 322KB
  • 下载

足以应付一切的水仙花数,字母交叉问题,数组排序去重复,今天get到一点点,首先一道题莫名其妙地改对了然后明白了自己思路是对的但是不会写代码 还是什么用都没有

一个范围内水仙花数,多组输入 数组去重

求无序数组排序后相邻俩数最大差值(思路及详解)

前两天在一个学长面试的时候遇到这样一个题,这里稍微详细说下本文的标题。给你n个任意整数,求排序后相邻两个数之间的最大差值,这里n可能有10^5,整数为任意32位整型。要求求解算法的时间复杂度为O(n)...
  • xindoo
  • xindoo
  • 2016年10月15日 08:54
  • 1650
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:表排序(思路一)
举报原因:
原因补充:

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