| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4536 人关注过本帖, 2 人收藏
标题:发一些常见的排序算法的c++代码(每个排序以成员函数形式集成到了每个类中)
只看楼主 加入收藏
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
结帖率:100%
收藏(2)
 问题点数:0 回复次数:28 
发一些常见的排序算法的c++代码(每个排序以成员函数形式集成到了每个类中)
这里的排序代码基本把所有常见排序代码都涉及了,半个月的心血,
全部通过测试,正确运行。

#ifndef DATASORTLIST_H
#define DATASORTLIST_H

#include<iostream.h>
#include<stdlib.h>
const int DefaultSize=100;

////////////////////////////////////////////////////
//数据表元素Element<T,E>类模板的实现
//T是数据元素的关键码类型,E是元素的数据域的类型
////////////////////////////////////////////////////
template<class T,class E>
class Element
{
public:
    T key;                   //数据元素的关键码
    E data;                  //数据元素的数据域

    Element()                //默认构造函数
    {key=0;data=0;};
    Element(T k,E d)         //构造函数
    {key=k;data=d;};
    T getkey()               //获取关键码
    {return key;};
    T getdata()              //获取关键码
    {return data;};

    //成员重载赋值运算符
    Element<T,E>& operator=(Element<T,E>& R)
    {key=R.key;data=R.data;return *this;}
    //成员重载下列的关系运算符
    bool operator==(Element<T,E>& R)
    {return key==R.key;};
    bool operator<=(Element<T,E>& R)
    {return key<=R.key;};
    bool operator>=(Element<T,E>& R)
    {return key>=R.key;};
    bool operator<(Element<T,E>& R)
    {return key<R.key;};
    bool operator>(Element<T,E>& R)
    {return key>R.key;};
    bool operator!=(Element<T,E>& R)
    {return key!=R.key;};
    //友元重载<<输出运算符
    friend ostream& operator<<(ostream& os,Element<T,E>& R);
};
///////////////////////////////////Element类定义结束

////////////////////////////////////////////////////
//友元重载<<输出运算符
////////////////////////////////////////////////////
template<class T,class E>
ostream& operator<<(ostream& os,Element<T,E>& R)
{
    os<<R.key<<":"<<R.data;
    return os;
};
//////////////////////////////////////<<友元重载结束

////////////////////////////////////////////////////
//DataSortList<T,E>排序数据表类的定义
//T是关键码的类型,E是数据域的数据的类型
////////////////////////////////////////////////////
template<class T,class E>
class DataSortList
{
private:
    Element<T,E>* Vector;           //存储带排序的数据元素的向量
    int maxSize;                    //Vector的最大容量
    int currentSize;                //当前的Vetor里的元素的个数
public:
    DataSortList(int sz=DefaultSize)//默认构造函数
    {maxSize=sz;currentSize=0;
    Vector=new Element<T,E>[maxSize];};
    DataSortList(Element<T,E> A[],  //构造函数:通过数组来初始化本表
        int n);    
    int Length()                    //得到当前表的长度
    {return currentSize;};
    void Swap(Element<T,E>& x,
        Element<T,E>& y)            //交换两个数据元素的内容
    {Element<T,E> temp=x;x=y;y=temp;};
    Element<T,E>& operator[](int i) //返回指定编号的结点
    {return Vector[i];};
    void Display()                  //显示当前排序表的内容
    {for(int i=0;i<currentSize;i++)
    cout<<Vector[i].key<<" ";};

    void BubbleSort();              //对当前向量进行冒泡升序排序
    void BSImprove();               //冒泡排序的一个改进算法
    void InsertSort(int left
        ,int right);                //直接插入排序
    void BinaryInsertSort(int left
        ,int right);                //折半插入排序
    void ShellSort(int left         //希尔排序
        ,int right);
    void CompareSort(int left       //顺序比较排序法
        ,int right);
    int Partition(int low           //对left到right进行划分(快排)
        ,int high);
    int AnoPartition(int low        //另一种双向的划分算法         
        ,int high);
    void QSort(int left
        ,int right);                //递归:对序列进行快速排序
    void QSortImprove1(int left
        ,int right);                //递归:快排的第一种改进算法
    void QSortImprove2(int left
        ,int right);                //递归:快排的第二种改进算法
    void HybridSort(int left        //先快排,得到基本有序序列后
        ,int right)                 //再统一进行一趟直接插入排序
    {QSortImprove2(left,right);
     InsertSort(left,right);}
    void SelectSort(int left        //直接选择排序
        ,int right);
    void RadixSort(int left,        //采用MSD方法的基数排序
        int right,int d);
    int getDigit(Element<T,E>& v    //获取关键码v的第d个排序码
        ,int d);
};
/////////////////////////DataSortList<T,E>类声明结束

////////////////////////////////////////////////////
//带参数的构造函数
////////////////////////////////////////////////////
template<class T,class E>
DataSortList<T,E>::DataSortList(Element<T,E> A[],int n)
{
    maxSize=n+10;
    Vector=new Element<T,E>[maxSize];
    for(int i=0;i<n;i++)     //初始化排序向量
        Vector[i]=A[i];
    currentSize=n;
};
////////////////////////////////////////构造函数结束

[[it] 本帖最后由 geninsf009 于 2008-11-23 20:51 编辑 [/it]]
搜索更多相关主题的帖子: 算法 函数 成员 形式 代码 
2008-11-23 20:26
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
冒泡排序
////////////////////////////////////////////////////
//Bubble()公有成员函数
//对当前的向量进行冒泡的升序排序
////////////////////////////////////////////////////
template<class T,class E>
void DataSortList<T,E>::BubbleSort()
{
    for(int i=1;i<=currentSize-1;i++)     //一共n-1趟排序
        for(int j=currentSize-1;j>=i;j--) //每趟从最后一个向前排到i
            if(Vector[j]<Vector[j-1])     //如果是逆序
                Swap(Vector[j],Vector[j-1]);
};
////////////////////////////////Bubble()公有函数结束
2008-11-23 20:27
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
一种改进后的冒泡
////////////////////////////////////////////////////
//BSImprove()公有函数
//冒泡排序的一个改进算法
////////////////////////////////////////////////////
template<class T,class E>
void DataSortList<T,E>::BSImprove()
{
    int exchange=1;                       //标记是否在上趟排序中交换了位置
    for(int i=1;i<=currentSize-1;i++)     //一共n-1趟排序
    {
        if(exchange==0)                   //如果上趟没有进行交换,说明已经没有逆序
            break;
        exchange=0;
        for(int j=currentSize-1;j>=i;j--) //每趟从最后一个向前排到i
        {
            if(Vector[j]<Vector[j-1])     //如果是逆序
            {
                Swap(Vector[j],Vector[j-1]);
                exchange=1;               //交换了位置
            };
        };
    };
};
/////////////////////////////////BSImprove()函数结束
2008-11-23 20:28
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
直接插入排序:
////////////////////////////////////////////////////
//InsertSort()公有成员函数 直接插入排序的算法
//把第i个元素插入到从0-i-1的已经排好的序列中去
//left是排序上界,right是排序下界
////////////////////////////////////////////////////
template<class T,class E>
void DataSortList<T,E>::InsertSort(int left,int right)
{
    //把从第二个开始到最后一个元素
    //插入到前面排好的序列中去
    for(int i=left+1;i<=right;i++)
    {
        //i是要插入的元素,放入temp中
        Element<T,E> temp=Vector[i];
        //待插入序列的最后一个元素
        int j=i-1;
        //寻找插入的位置
        while(temp<Vector[j] && j>=left)
        {
            //后移
            Vector[j+1]=Vector[j];
            j--;
        };
        //插入的过程
        Vector[j+1]=temp;
    };
};
////////////////////////////////InsertSort()函数结束
2008-11-23 20:28
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
折半插入排序算法:
////////////////////////////////////////////////////
//公有成员函数BinaryInsertSort()
//折半插入排序,即在把第i个元素插入的时,寻找插入
//的位置采用的是折半查找的方法来查找插入的位置
////////////////////////////////////////////////////
template<class T,class E>
void DataSortList<T,E>::BinaryInsertSort(int left,int right)
{
    //要插入的元素
    Element<T,E> temp;
    //从第二个元素开始依次插入后面的元素
    for(int i=left+1;i<=right;i++)
    {
        temp=Vector[i];
        //从left到j是已经排好的序列
        int j=i-1;
        //通过折半的方式查找元素该插入的位置
        int low=left,high=j,mid;
        //最后temp应该插入的位置是最后的mid
        while(low<=high)
        {
            mid=int((low+high)/2);
            if(temp<Vector[mid])
                high=mid-1;
            else if(temp>Vector[mid])
                low=mid+1;
            else
                break;
        };
        //把从mid到j的元素分别向后移动一格
        //以腾出mid位置并填以temp
        for(int p=j;p>=low;p--)
            Vector[p+1]=Vector[p];
        //填入temp
        Vector[low]=temp;
    };
};
//////////////////////////BinaryInsertSort()函数结束
2008-11-23 20:29
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
顺序比较法排序:
////////////////////////////////////////////////////
//CompareSort()公有成员函数
//采用顺序比较排序法对Vector进行排序
////////////////////////////////////////////////////
template<class T,class E>
void DataSortList<T,E>::CompareSort(int left,int right)
{
    //把第i个元素依次和后面的元素相比
    //把大的调整到后面
    for(int i=left;i<=right-1;i++)
        for(int j=i+1;j<=right;j++)
            if(Vector[i]>Vector[j])
                Swap(Vector[i],Vector[j]);
};
///////////////////////////////CompareSort()函数结束
2008-11-23 20:29
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
希尔排序:
////////////////////////////////////////////////////
//ShellSort()公有成员函数  插入排序之希尔排序
//首先把排序的区间分成gap个子区间,先对每个子区间
//进行直接插入排序,再把这些子区间个数进行减少,
//再重复进行直接插入排序,直到gap=1进行最后一次排序后完成
////////////////////////////////////////////////////
template<class T,class E>
void DataSortList<T,E>::ShellSort(int left,int right)
{
    //初始的间隔大小
    int gap=right-left+1;
    //临时元素变量
    Element<T,E> temp;
    int i,j;
    //把gap从最大到1的情况全部一遍
    do
    {
        gap=int(gap/3)+1;
        //以gap为间隙,对子序列进行直接插入排序
        for(i=left+gap;i<=right;i++)
        {
            j=i-gap;
            temp=Vector[i];
            while(temp<Vector[j] && j>=left)
            {
                Vector[j+gap]=Vector[j];
                j=j-gap;
            };
            Vector[j+gap]=temp;
        };
    }
    while(gap>1);
};
////////////////////////////////ShellShell()函数结束
2008-11-23 20:30
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
快速排序算法(含两种常见划分算法):
////////////////////////////////////////////////////
//Partition()公有成员函数结束
//对从low到high之间的元素以第一个元素为基准点进行划分
//即把比基准点小的元素全部移到右边,否则移到左边
//最后返回基准点所在的位置
////////////////////////////////////////////////////
template<class T,class E>
int DataSortList<T,E>::Partition(int low,int high)
{
    Element<T,E> base=Vector[low];    //以第一个元素作为基准点
    int p=low;                        //比基准点小的元素区域的尾指针
    for(int i=low+1;i<=high;i++)      //循环遍历基准点外的元素
    {
        if(Vector[i]<base)            //如果元素比基准点小
        {
            p++;
            Swap(Vector[i],Vector[p]);//把i元素调到前面去
        };
    };
    Swap(Vector[p],Vector[low]);      //把第一个基准点元素调整到中间来
    return p;                         //返回基准点应该在的位置
};
/////////////////////////////////Partition()函数结束

////////////////////////////////////////////////////
//AnoPartition()公有成员函数  另一种划分算法
//该算法采用的双向交替扫描的方法进行的
////////////////////////////////////////////////////
template<class T,class E>
int DataSortList<T,E>::AnoPartition(int low,int high)
{
    Element<T,E> base=Vector[low];   //存放基点元素
    int left,right;                  //左右的双向交替指针
    left=low;right=high;
    
    int flag=0;                      //0:表示从右向左1:表示从左向右
    while(left<right)
    {
        if(flag==0)
        {
            while(base<Vector[right])
                right--;
            Swap(Vector[left],Vector[right]);
            left++;
            flag=1;
        }
        else
        {
            while(base>=Vector[left])
                left++;
            Swap(Vector[left],Vector[right]);
            right--;
            flag=0;
        };
    };
    return left;
};
//////////////////////////////AnoPartition()函数结束

////////////////////////////////////////////////////
//QSort()公有成员函数
//递归:对当前的序列进行快速排序
//每趟排序后,把小的移到基准点左边,大的到基准点右边
//基准点就是最后的位置
////////////////////////////////////////////////////
template<class T,class E>
void DataSortList<T,E>::QSort(int left,int right)
{
    if(left<right)                    //left==right是排序结束的条件
    {
        int mid=Partition(left,right);//对整个序列进行划分,得到基准点位置
        QSort(left,mid-1);            //对右边序列进行递归快排
        QSort(mid+1,right);           //对右边序列进行递归快排
    }
};
/////////////////////////////QSort()公有成员函数结束
2008-11-23 20:31
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
第一种改进后的快速排序算法:
////////////////////////////////////////////////////
//QSortImprove1()公有成员函数
//对快速排序的第一种改进算法:因为快适合序列规模较大
//的场合,如果序列规模小了其效率要比直接插入排序低10%
//左右,所以当自序列划分小到一定程度的时候可以考虑
//采用直接插入排序而不是继续递归快排
////////////////////////////////////////////////////
template<class T,class E>
void DataSortList<T,E>::QSortImprove1(int left,int right)
{
    if(right-left<3)                  //如果自序列的规模较小
        InsertSort(left,right);       //可以考虑用直接插入排序
    else
    {                                 //如果规模较大就用递归快排
        int mid=Partition(left,right);//对整个序列进行划分,得到基准点位置
        QSortImprove1(left,mid-1);    //对右边序列进行递归快排
        QSortImprove1(mid+1,right);   //对右边序列进行递归快排
    }
};
/////////////////////////////QSortImprove1()函数结束
2008-11-23 20:32
geninsf009
Rank: 3Rank: 3
等 级:论坛游民
威 望:8
帖 子:613
专家分:95
注 册:2008-8-16
收藏
得分:0 
快排的第二种改进的算法:
////////////////////////////////////////////////////
//QSortImprove2()公有成员函数
//对快速排序的第一种改进算法:因为快适合序列规模较大
//的场合,如果序列规模小了其效率要比直接插入排序低10%
//左右,所以当自序列划分小到一定程度的时候可以考虑
//采用直接返回不排了而不是继续递归快排,然后对
//基本有序的序列在同一进行一趟直接插入排序,因为对
//基本有序的序列,直接插入排序的效率很高
////////////////////////////////////////////////////
template<class T,class E>
void DataSortList<T,E>::QSortImprove2(int left,int right)
{
    if(right-left<25)                 //如果自序列的规模较小
        return;                       //可以考虑用直接返回
    else
    {                                 //如果规模较大就用递归快排
        int mid=Partition(left,right);//对整个序列进行划分,得到基准点位置
        QSortImprove1(left,mid-1);    //对右边序列进行递归快排
        QSortImprove1(mid+1,right);   //对右边序列进行递归快排
    };
};
/////////////////////////////QSortImprove2()函数结束
2008-11-23 20:32
快速回复:发一些常见的排序算法的c++代码(每个排序以成员函数形式集成到了每个类 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019132 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved