64,561
社区成员
发帖
与我相关
我的任务
分享
template<typename T ...> //这里具体要怎样?
class Sorting
{
//这里帮我设计一下数据成员及接口
};
main()
{
//这里帮我写一下调用方法
}
//为方便大家看,我弄一个文件里了
#include<iostream>
#include<ctime>
using namespace std;
const int MAXSIZE = 100;
template<typename T>
class Sorting
{
Sorting<int> *array;
public:
Sorting(Sorting<int> *arr);
void Merge_Sort(int *arr,int low,int high);
void Display();
private:
void Merge(int *arr,int low,int mid,int high);
};
template<typrname T>
Sorting<int>::Sorting(Sorting<int> *arr)
{
srand(unsigned(time(0)));
for (int i=0;i<MAXSIZE;i++)
arr[i] = rand()%10000;
}
template<typename>
void Sorting<int>::Merge_Sort(Sort<int> *arr,int low,int high)
{
if (low<high)
{
int mid = (low+high)/2;
Merge_Sort(arr,low,mid);
Merge_Sort(arr,mid+1,high);
Merge(arr,low,mid,high);
}
}
template<typename>
void Sorting<int>::Merge(Sorting<int> *arr,int low,int mid,int high)
{
int num1 = mid-low+1,num2 = high-mid; //待合并元素的个数
int left[num1],right[num2];
for(int i=1;i<=num1;i++)
left[i] = arr[low+i-1];
for(int j=1;j<=num2;j++)
right[i] = arr[mid+j];
left[num1+1] = 20000,right[num2+1] = 20000;
int i=1,j=1;
for(int k=low;k<=high;k++)
if (left[i] <right[i]{arr[k] = left[i],i++;}
else {arr[k] = right[j],j++;}
}
template<typename T>
void Sorting<int>::Display()
{
for(int i=0;i<MAXSIZE;i++)
{
cout<<array[i]<<" ";
if(i+1)%10 == 0) cout<<endl;
}
}
int main(void)
{
Sorting<int> *Sort_Object;
Sort_Object.Merge_Sort(Sort_Object,0,MAXSIZE);
Sort_Object.Display();
return 0;
}
template<typename Type> void Sort<Type>::QuickSort(DataList<Type> &list, int left=0, int right=-3){
if (-3 == right){
right = list.m_ncurrentsize - 1;
}
if (left < right){
int pivotpos = left;
Element<Type> pivot = list.m_pvector[left];
for (int i=left+1; i<=right; i++){
if (list.m_pvector[i]<pivot && ++pivotpos!=i){
list.Swap(list.m_pvector[pivotpos], list.m_pvector[i]);
}
}
list.Swap(list.m_pvector[left], list.m_pvector[pivotpos]);//此处应该写FOR外面...
QuickSort(list, left, pivotpos-1);
QuickSort(list, pivotpos+1, right);
}
}
Data.h
template<typename Type> class Element{
public:
Type GetKey(){
return key;
}
void SetKey(Type item){
key = item;
}
public:
Element<Type>& operator =(Element<Type> copy){
key = copy.key;
return *this;
}
bool operator ==(Element<Type> item){
return this->key == item.key;
}
bool operator !=(Element<Type> item){
return this->key != item.key;
}
bool operator <(Element<Type> item){
return this->key < item.key;
}
bool operator >(Element<Type> item){
return this->key > item.key;
}
bool operator >=(Element<Type> item){
return this->key >= item.key;
}
bool operator <=(Element<Type> item){
return this->key <= item.key;
}
private:
Type key;
};
template<typename Type> class Sort;
template<typename Type> class DataList{
public:
friend class Sort<Type>;
DataList(int size=m_nDefaultSize): m_nMaxSize(size), m_ncurrentsize(0){
m_pvector = new Element<Type>[size];
}
DataList(Type *data, int size);
bool Insert(Type item);
~DataList(){
delete[] m_pvector;
}
int Size(){
return this->m_ncurrentsize;
}
void Swap(Element<Type> &left, Element<Type> &right){
Element<Type> temp = left;
left = right;
right = temp;
}
void Print();
private:
static const int m_nDefaultSize = 10;
Element<Type> *m_pvector;
const int m_nMaxSize;
int m_ncurrentsize;
};
template<typename Type> DataList<Type>::DataList(Type *data, int size)
: m_nMaxSize(size > m_nDefaultSize ? size : m_nDefaultSize), m_ncurrentsize(0){
this->m_pvector = new Element<Type>[size];
for (int i=0; i<size; i++){
this->m_pvector[i].SetKey(data[i]);
}
this->m_ncurrentsize += size;
}
template<typename Type> bool DataList<Type>::Insert(Type item){
if (this->m_ncurrentsize == this->m_nMaxSize){
cerr << "The list is full!" <<endl;
return 0;
}
this->m_pvector[this->m_ncurrentsize++].SetKey(item);
}
template<typename Type> void DataList<Type>::Print(){
cout << "The list is:";
for (int i=0; i<this->m_ncurrentsize; i++){
cout << " " << this->m_pvector[i].GetKey();
}
}
Sort.h
#include "Data.h"
template<typename Type> class Sort{
public:
void InsertSort(DataList<Type> &list, int n=-1);
void BinaryInsertSort(DataList<Type> &list, int n=-1);
void ShellSort(DataList<Type> &list, const int gap=-1);
void BubbleSort(DataList<Type> &list);
void QuickSort(DataList<Type> &list, int left=0, int right=-3);
void SelectSort(DataList<Type> &list);
void HeapSort(DataList<Type> &list);
void MergeSort(DataList<Type> &list);
void RadixSort(DataList<int> &list, int m, int d); //just use for integer!
private:
void BubbleSwap(DataList<Type> &list, const int n, int &flag);
void SelectChange(DataList<Type> &list, const int n);
void HeapAdjust(DataList<Type> &list, const int start, const int end);
void Merge(DataList<Type> &list, DataList<Type> &mergedlist, const int len);
void MergeDouble(DataList<Type> &list, DataList<Type> &mergedlist, const int start, const int part, const int end);
};
//算法实现区...
test.cpp
#include <iostream>
using namespace std;
#include "Sort.h"
int main(){
int init[15]={1,3,5,7,4,2,8,0,6,9,29,13,25,11,32};
DataList<int> data(init, 15);
Sort<int> sort;
data.Print();
cout << endl << endl <<endl;
sort.InsertSort(data);
sort.BinaryInsertSort(data);
sort.ShellSort(data);
sort.BubbleSort(data);
sort.QuickSort(data);
sort.SelectSort(data);
sort.HeapSort(data);
sort.MergeSort(data);
sort.RadixSort(data, 2, 10);
data.Print();
return 0;
}
#include<iostream>
#include<ctime>
using namespace std;
const int MAXSIZE = 100;
template<typename T>
class Sorting
{
T *array;
public:
Sorting(T *arr);
Sorting();
void Merge_Sort(T *arr, int p, int r);
T* GetArray();
void Display();
//~Sorting();
private:
void merge(T *arr, int p, int q, int r);
};
template<typename T>
Sorting<T>::Sorting()
{
array = new int[100];
srand(unsigned(time(0)));
for (int i=0;i<MAXSIZE;i++)
array[i] = rand()%10000;
}
template<typename T>
T* Sorting<T>::GetArray()
{
return array;
}
template<typename T>
void Sorting<T>::merge(T *arr, int p, int q, int r)
{
int n1 = q-p+1;
int n2 = r-q;
int* L = new int[n1];
int* R = new int[n2];
for (int t=0; t<n1; t++) L[t] = arr[p+t];
for (int t=0; t<n2; t++) R[t] = arr[q+t+1];
int i = 0;
int j = 0;
int k = p;
while (i<n1 && j<n2) //一个数组输出完毕后跳出此循环
if (L[i] <= R[j])
arr[k++] = L[i++];
else arr[k++] = R[j++]; //L或R数组输出完毕后把另一个数组余下的部分全部输出
while (i<n1) arr[k++] = L[i++]; //一下两个while永远只有一个执行,即未输出完的数组继续输出剩余部分
while (j<n2) arr[k++] = R[j++];
}
template<typename T>
void Sorting<T>::Merge_Sort(T *arr, int p, int r)
{
if (p<r)
{
int q = (p+r)/2;
Merge_Sort(arr, p, q);
Merge_Sort(arr, q+1, r);
merge(arr, p, q, r);
}
}
template<typename T>
void Sorting<T>::Display()
{
for (int i=0;i<MAXSIZE;i++)
{
cout<<array[i]<<" ";
if ((i+1)%10 == 0) cout<<endl;
}
}
int main(void)
{
Sorting<int> *Sort_Object = new Sorting<int> ();
Sort_Object->Merge_Sort(Sort_Object->GetArray(),0,MAXSIZE);
Sort_Object->Display();
system("pause");
return 0;
}
template <typename T>
T* Sorting <T>::GetArray()
{
return array; //改为this->array也不行
}
#include<iostream>
#include<ctime>
using namespace std;
const int MAXSIZE = 100;
template<typename T>
class Sorting
{
T *array;
public:
Sorting(T *arr);
void Merge_Sort(T *arr,int low,int high);
T* GetArray();
void Display();
//~Sorting();
private:
void Merge(T *arr,int low,int mid,int high);
};
template<typename T>
Sorting<T>::Sorting(T *arr)
{
arr = new int[100];
srand(unsigned(time(0)));
for (int i=0;i<MAXSIZE;i++)
arr[i] = rand()%10000;
}
template<typename T>
T* Sorting<T>::GetArray()
{
return array;
}
template<typename T>
void Sorting<T>::Merge_Sort(T *arr,int low,int high)
{
if (low<high)
{
int mid = (low+high)/2;
Merge_Sort(arr,low,mid);
Merge_Sort(arr,mid+1,high);
Merge(arr,low,mid,high);
}
}
template<typename T>
void Sorting<T>::Merge(T *arr,int low,int mid,int high)
{
int num1 = mid-low+1,num2 = high-mid; //待合并元素的个数
//int left[num1],right[num2];
int *left = new int[num1];
int *right = new int[num2];
for (int i=1;i<=num1;i++)
left[i] = arr[low+i-1];
for (int j=1;j<=num2;j++)
right[j] = arr[mid+j];
left[num1+1] = 20000,right[num2+1] = 20000;
int i=1,j=1;
for (int k=low;k<=high;k++)
if (left[i] <right[i])
{
arr[k] = left[i],i++;
}
else
{
arr[k] = right[j],j++;
}
}
template<typename T>
void Sorting<T>::Display()
{
for (int i=0;i<MAXSIZE;i++)
{
cout<<array[i]<<" ";
if ((i+1)%10 == 0) cout<<endl;
}
}
int main(void)
{
Sorting<int> *Sort_Object;
Sort_Object->Merge_Sort(Sort_Object->GetArray(),0,MAXSIZE);
Sort_Object->Display();
return 0;
}