排序

Element.h

template<typename Type>
class Element{
private:
	Type key;
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;
	}
};

DataList.h

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);
	DataList(Element<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;
};

DataList.cpp

template<typename Type> DataList<Type>::DataList(Type *data, int size)
		:m_nMaxSize(size>m_nDefaultSize?size:m_nDefaultSize),m_ncurrentsize(0){
	m_pvector = new Element<Type>[size];
	for(int i = 0; i < size; i++)
		m_pvector[i].SetKey(data[i]);
	m_ncurrentsize += size;
}

template<typename Type> DataList<Type>::DataList(Element<Type> *data, int size)
		:m_nMaxSize(size>m_nDefaultSize?size:m_nDefaultSize),m_ncurrentsize(0){
	m_pvector = new Element<Type>[size];
	for(int i = 0; i < size; i++)
		m_pvector[i].SetKey(data[i].GetKey());
	m_ncurrentsize += size;
}

template<typename Type> bool DataList<Type>::Insert(Type item){
	if(m_ncurrentsize >= m_nMaxSize){
        cerr << "The list is full!" <<endl;
        return 0;
    }
	m_pvector[m_ncurrentsize++]->Setkey(item);
}

template<typename Type> void DataList<Type>::Print(){
	for(int i = 0; i < m_ncurrentsize; i++)
	{
		cout<<m_pvector[i].GetKey()<<' ';
	}
	cout<<endl;
}

Sort.h

#include "Data.h"
#include "LinkQueue.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, int n = -1);
	void BubbleSort(DataList<Type> &list);
	void QuickSort(DataList<Type> &list, int left=0, int right=-1);
	void SelectSort(DataList<Type> &list);
	void HeapSort(DataList<Type> &list);
	void MergeSort(DataList<Type> &list);
	void RadixSort(DataList<int> &list, int m, int d);
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, int start, int end);
    void MergeDouble(DataList<Type> &list, DataList<Type> &mergedlist, const int start, const int part, const int end);
};

Sort.cpp

template<typename Type> void Sort<Type>::InsertSort(DataList<Type> &list, int n){
	if (-1 == n){
		for (int i=1; i<list.Size(); i++){
            InsertSort(list, i);
        }
        return;
    }
	Element<Type> temp = list.m_pvector[n];
	int i;
	for(i =n; i >0 ; i--)
	{
		if(temp > list.m_pvector[i-1])
			break;
		else
			list.m_pvector[i] = list.m_pvector[i-1];
	}
	list.m_pvector[i] = temp;
}

template<typename Type> void Sort<Type>::BinaryInsertSort(DataList<Type> &list, int n){
	if(-1 == n)
	{
		for(int i = 1; i < list.Size(); i++)
			BinaryInsertSort(list ,i);
		return ;
	}
	Element<Type> temp = list.m_pvector[n];
	int left = 0, right = n-1;
	while(left <= right)
	{
		int middle = (left + right) / 2;
		if(temp < list.m_pvector[middle])
			right = middle - 1;
		else left = middle + 1;
	}
	for (int i=n-1; i>=left; i--)
        list.m_pvector[i+1] = list.m_pvector[i];
	list.m_pvector[left] = temp;
}

template<typename Type> void Sort<Type>::ShellSort(DataList<Type> &list, const int gap){
	if(-1 == gap){
		int gap = list.Size() / 2;
		while(gap){
			ShellSort(list,gap);
			gap = gap / 2;
		}
		return ;
	}
	int i,j;
	for(i = gap; i < list.Size(); i++)
	{
		Element<Type> temp = list.m_pvector[i];
		if(temp < list.m_pvector[i-gap])
		{
			for(j = i - gap; j >=0 && temp < list.m_pvector[j]; j-=gap)
				list.m_pvector[j+gap] = list.m_pvector[j];
			list.m_pvector[j+gap] = temp;
		}
	}
}

template<typename Type> void Sort<Type>::BubbleSwap(DataList<Type> &list, const int n, int &flag){
	flag = 0;
	for(int i = list.Size() - 1; i >= n; i--)
	{
		if(list.m_pvector[i-1] > list.m_pvector[i])
		{
			list.Swap(list.m_pvector[i-1], list.m_pvector[i]);
			flag = 1;
		}
	}
}

template<typename Type> void Sort<Type>::BubbleSort(DataList<Type> &list){
	int flag = 1, n = 0;
	while(++n < list.Size() && flag)
		BubbleSwap(list, n, flag);
}

template<typename Type> void Sort<Type>::QuickSort(DataList<Type> &list, int left=0, int right=-1){
	if(-1 == right)
		right = list.Size() -1 ;
	int a = left, b = right;
	if(left < right)
	{
		int pos = left;
		Element<Type>temp = list.m_pvector[left];
		while(left < right)
		{
			while(left < right && list.m_pvector[right] >= temp)
				--right;
			list.m_pvector[left] = list.m_pvector[right];
			while(left < right && list.m_pvector[left] <= temp)
				++left;
			list.m_pvector[right] = list.m_pvector[left];
		}
		list.m_pvector[left] = temp;
		QuickSort(list, a, left - 1);
		QuickSort(list, left + 1, b);
	}
}

template<typename Type> void Sort<Type>::SelectChange(DataList<Type> &list, const int n){
	int j = n;
	for(int i = n + 1; i < list.Size(); i++)
	{
		if(list.m_pvector[i] < list.m_pvector[j])
			j = i;
	}
	if(j != n)
		list.Swap(list.m_pvector[n], list.m_pvector[j]);
}

template<typename Type> void Sort<Type>::SelectSort(DataList<Type> &list){
	for(int i = 0; i < list.Size()-1; i++)
		SelectChange(list, i);
}

template<typename Type> void Sort<Type>::HeapAdjust(DataList<Type> &list, const int start, const int end){
	int current = start, child = 2 * current + 1;
	Element<Type> temp = list.m_pvector[start];
	while(child <= end)
	{
		if(child < end && list.m_pvector[child] < list.m_pvector[child+1])
			child++;
		if(temp >= list.m_pvector[child])
			break;
		else
		{
			list.m_pvector[current] = list.m_pvector[child];
			current = child;
			child = 2 * current + 1;
		}
	}
	list.m_pvector[current] = temp;
}

template<typename Type> void Sort<Type>::HeapSort(DataList<Type> &list){
	for(int i = (list.Size()-2)/2; i >= 0; i--)
		HeapAdjust(list, i, list.Size() - 1);
	for(int i = list.Size() - 1; i >= 1; i--)
	{
		list.Swap(list.m_pvector[0], list.m_pvector[i]);
		HeapAdjust(list, 0, i-1);
	}
}

template<typename Type> void Sort<Type>::MergeDouble(DataList<Type> &list, DataList<Type> &mergedlist, int start, int part, int end){
	int j, k;
	for(j = part+1,k=start; start <= part&&j<=end; ++k)
	{
		if(list.m_pvector[start] < list.m_pvector[j])
			mergedlist.m_pvector[k] = list.m_pvector[start++];
		else
			mergedlist.m_pvector[k] = list.m_pvector[j++];
	}
	if(start <= part)
	{
		int i1,i2;
		for(i1=k,i2=start; i1<=end,i2<=part; i1++,i2++)
			mergedlist.m_pvector[i1] = list.m_pvector[i2];
	}
	if(j <= end)
	{
		int i1,i2;
		for(i1=k,i2=j; i1<=end,i2<=end; i1++,i2++)
			mergedlist.m_pvector[i1] = list.m_pvector[i2];
	}
}

template<typename Type> void Sort<Type>::Merge(DataList<Type> &list, DataList<Type> &mergedlist, int start, int end){
	if(start == end)
		mergedlist.m_pvector[start] = list.m_pvector[start];
	else{
		DataList<Type> temp(list.m_pvector,list.m_nMaxSize);
		int m = (start + end) / 2;
		Merge(list, temp, start, m);
		Merge(list, temp, m + 1, end);
		MergeDouble(temp, mergedlist, start, m, end);
	}
}

template<typename Type> void Sort<Type>::MergeSort(DataList<Type> &list){
	Merge(list, list, 0, list.Size() - 1);
}

template<typename Type> void Sort<Type>::RadixSort(DataList<int> &list, int m, int d){
	LinkQueue<int> *queue = new LinkQueue<int>[d];
    int power = 1;
    for (int i=0; i<m; i++){
        if (i){
            power = power * d;
        }
        for (int j=0; j<list.m_ncurrentsize; j++){
            int k = (list.m_pvector[j].GetKey() / power) % d;
            queue[k].Append(list.m_pvector[j].GetKey());
        }

        for (int j=0,k=0; j<d; j++){
            while (!queue[j].IsEmpty()){
                list.m_pvector[k++].SetKey(queue[j].Delete());
            }
        }
    }
}

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;
}

转载于:https://my.oschina.net/windmissing/blog/690479

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值