注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

每天收获一点点-目标:富足

 
 
 

日志

 
 

初涉泛型编程之排序  

2012-04-24 21:35:20|  分类: C++编程思想(卷 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
说明:
1.支持多种数据类型
2.通过设置计数来计算每种排序的操作次数
注:暂时只完成了插入排序和选择排序初涉泛型编程之排序 - 刘邓 - 刘邓
 
初涉泛型编程之排序 - 刘邓 - 刘邓


 

//SortMain.cpp
//主函数部分
#include"Sort.h"
#include"CSort.h"
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
typedef CSort<int> ISORT;
typedef CSort<float> FSORT;
typedef CSort<double> DSORT;
int main()
{
int *p;
int tmp;
int n;//数组长度
int i = 0;//循环计数
string sName;
cout<<"Please Enter Your File Name:";
cin>>sName;
fstream CIN;
CIN.open(sName,ios::in);
while(!CIN.eof())
{
i++;
CIN>>tmp;
}
CIN.close();
CIN.open(sName,ios::in);
n = i;
p = new int[i];
i = 0;
while(! CIN.eof())
{
CIN>>p[i];
i++;
}
CIN.close();
ISORT sort(p,n);
cout<<"请输入要采用的排序法:"<<endl;
cout<<"1.插入排序 2.选择排序 3.冒泡排序"<<endl;
cout<<"4.快速排序 5.希尔排序 6.堆排序"<<endl;
do{
cin>>i;
switch (i)
{
case 1:sort.InsertS();break;
case 2:sort.SelectS();break;
case 3:sort.BubbleS();break;
case 4:sort.QuickS();break;
case 5:sort.ShellS();break;
case 6:sort.StackS();break;
default:cout<<"输入错误";i= -1;break;
}
}while(i == -1);
sort.print();
cout<<endl;
return 0;
}

//CSort.h
//CSort类的函数实现部分
#ifndef X1
#define X1
#include"Sort.h"
#include<fstream>
namespace SelfDefine{
template <typename T>
void swap(T& t1,T& t2) //在排序中频繁用到交换
{
T tmp;
tmp = t1;
t1 = t2;
t2 = tmp;
}
}
template <typename T>
void CSort<T>::SelectS(void)
{
/*
选择排序:
从数组的头开始往后遍历,找到最小的成员然后和数组头部元素互换位置
然后从第二个成员开始往后遍历找到剩下部分最小的元素和第二个位置元素互换位置
以此类推,直到排序完成。
*/
int i = 0,j = 0;//循环计数
T tmpMin = m_pArray[0];//用来保存一次遍历中最小的数
int count = 0; //记录最小的元素出现的位置
for(i = 0;i<m_nNumber;i++)
{
count = i;
tmpMin = m_pArray[i];
for(j = i+1;j<m_nNumber;j++)
{
m_count++;
if(m_pArray[j]<tmpMin) {tmpMin = m_pArray[j];count = j;}
}
SelfDefine::swap(m_pArray[i],m_pArray[count]);
}
}
template <typename T>
void CSort<T>::BubbleS(void)
{

}

template <typename T>
void CSort<T>::QuickS(void)
{

}

template <typename T>
void CSort<T>::ShellS(void)
{

}

template <typename T>
void CSort<T>::StackS(void)
{

}

template <typename T>
void CSort<T>::InsertS(void)
{
/*
插入排序:
在原数组的基础上从第二个数开始为期在数组内寻找“合适”的位置
所谓合适的位置就是上一个元素比自身小,下一个元素比自身大(首位特例)
*/
int i,j,k;
T tmp;
for(i = 1;i<m_nNumber;i++) //从第二个元素开始
{
tmp = m_pArray[i];
for(j = 0;j<i;j++)
{
m_count++;
if(m_pArray[i]<m_pArray[j]) //找出元素应该在的位置
{
for(k=i;k>j;k--)
{
m_pArray[k] = m_pArray[k-1];
m_count ++;
}//将合适位置的元素往后移动一位
m_pArray[j] = tmp;//将元素插入到合适位置
break;
}
}
}

}
template <typename T>
void CSort<T>::print(void)
{
cout<<"排序后的结果为(从小到大):\n";
fstream COUT("E:\\Result.txt",ios::out);
for(int i =0;i<m_nNumber;i++)
{
cout<<m_pArray[i]<<" ";
COUT<<m_pArray[i]<<" ";
}
COUT.close();
cout<<endl;
cout<<"进行的操作次数为:";
cout<<m_count<<endl;
cout<<"排序结果已保存至E盘Result.txt,请查阅。";
}


#endif


//Sort.h
//排序类的定义
#ifndef X
#define X
#include<iostream>
#include<cstdlib>
using namespace std;
template <typename T>
class CSort{
private:
T* m_pArray; //Array
int m_nNumber; //size of Array
int m_count;//记录比较次数
public:
CSort(){}
CSort(T* p,int n):m_nNumber(n){m_count = 0;m_pArray = p;}
~CSort(){delete []m_pArray;}
void InsertS(void);
void QuickS(void);
void SelectS(void);
void StackS(void);
void BubbleS(void);
void ShellS(void);
void print(void);
};
#endif

  评论这张
 
阅读(105)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017