欢迎关注大数据技术架构与案例微信公众号:过往记忆大数据
过往记忆博客公众号iteblog_hadoop
欢迎关注微信公众号:
过往记忆大数据

各种排序算法C++模版类实现

闲来无事,于是把常用的排序算法自己写了一遍,也当做是复习一下。

/*************************************************************** 
 *															   * 
 * 															   * 
 *      		Date   : 2012. 05. 03 				     	   * 
 * 				Author : 397090770							   * 
 *				Email  : wyphao.2007@163.com 				   * 
 *															   * 
 * 															   *
 ***************************************************************/ 

#include <iostream>
#include <iomanip.h> 

#define LEN 100  //排序数的个数 
#define NUM 10	 //每行输出的字数个数 
 
using namespace std;

//////////////////////////////////////////////////////////////////// 
//树节点 
template <class T> 
class Node{ 
public:
	Node *left;
	Node *right;
	T data;
	
	Node() : left(NULL), right(NULL), data(NULL){}
	~Node(){} 
}; 

//////////////////////////////////////////////////////////////////// 
class Sort{
public:
	Sort(){};	
	~Sort(){};
	//快速排序 
	template <class T>
	void QuickSort(T arr[], int low, int hight);
	
	//选择排序 
	template <class T>
	void SelectSort(T arr[], int len);
	
	//冒泡排序 
	template <class T>
	void BubbleSort(T arr[], int len);
	
	//插入排序 
	template <class T>
	void InsertSort(T arr[], int len);
	
	//堆排序 
	template <class T>
	void HeapSort(T arr[], int len);
	
	//二叉排序树排序 
	template <class T>
	void TreeSort(T arr[], int len); 
	
private:
	//快速排序中选择中心点 
	template <class T>
	int Quick(T arr[], int left, int right);
	
	//建立堆 
	template <class T>
	void CreateHeap(T arr[], int root, int len);
	
	//建立二叉排序树 
	template <class T>
	Node<T>* BuildTree(Node<T>*root, T data); 
	
	//中序遍历二叉排序树 
	template <class T>
	void InTree(Node<T> *root, T arr[]);	 
};

//////////////////////////////////////////////////////////////////// 
int main(){
	Sort sort;
	int *arr; 								//需要排序的数组 
	int width = 0; 							//最大数的位数,用于排列输出结果  
	int len = LEN; 							//用来求最大数的位数
	arr = (int *)malloc(LEN * sizeof(int)); //分配空间 
	if(arr == NULL){						//空间分配失败 
		cout << "Malloc failed!" << endl;
		exit(1); 
	} 
	
	srand(time(NULL));						//设置种子 
	for(int i = 0; i < LEN ;i++){			//随机生成数字 
		arr[i] = (rand() % (LEN * 10)) + 1;  
	} 
	
	//sort.SelectSort(arr, LEN);
	sort.TreeSort(arr, LEN);
	
	//求得最大数的位数,用于排列输出结果 
	while(len){
		width++;
		len /= 10; 
	}
	 
	for(int i = 0; i < LEN; i++){			//输出排序后的数字 
		cout << setw(width) << arr[i] << " ";
		cout << fixed;
		if((i + 1) % NUM == 0){				//每行输出的数字个数 
			cout << endl; 
		} 
	}
	
	cout << endl;
	return 0;
}

//////////////////////////////////////////////////////////////////// 
//快速排序 
template <class T>
void Sort::QuickSort(T arr[], int low, int hight){
	int pivot = -1;
	if(low <= hight){
		pivot = Quick(arr, low, hight);
		QuickSort(arr, low, pivot - 1);
		QuickSort(arr, pivot + 1, hight);
	}
}

//返回中轴点的下标 
template <class T>
int Sort::Quick(T arr[], int left, int right){
	int i = left + 1, j = right;
	int flag = left;
	int temp;
	
	while(i <= j){
		while(i <= j && arr[i] < arr[flag]){
			++i;
		}
		while(i <= j && arr[j] > arr[flag]){
			--j;
		}
		if(i < j){
			temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
			++i;
			--j;		
		}
	}
	
	temp = arr[flag];
	arr[flag] = arr[j];
	arr[j] = temp;
	return j;
}

//////////////////////////////////////////////////////////////////// 
//选择排序 
template <class T>
void Sort::SelectSort(T arr[], int len){
	int index;
	T temp;
	for(int i = 0; i < len - 1; i++){
		index = i;
		for(int j = i + 1; j < len; j++){
			if(arr[index] > arr[j]){
				index = j;
			}
		}
		if(index != i){
			temp = arr[index];
			arr[index] = arr[i];
			arr[i] = temp;
		}
	}		
}

//////////////////////////////////////////////////////////////////// 
//冒泡排序
template <class T>
void Sort::BubbleSort(T arr[], int len){
	T temp;
	bool flags = true; 
	for(int i = len - 1; i > 0; i--){
		if(flags){ 
			flags = false; 
			for(int j = 0; j < i; j++){
				if(arr[j] > arr[j + 1]){
					flags = true;
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
					for(int k = 0; k < LEN; k++){
						cout << arr[k] << " "; 
					} 
					cout << endl;
				}
			}
		}else{
			break; 
		} 
	} 
} 

//////////////////////////////////////////////////////////////////// 
//插入排序
template <class T>
void Sort::InsertSort(T arr[], int len){
	T temp; 
	int i, j; 
	for(i = 1; i < len; i++){
		temp = arr[i]; 
		for(j = i - 1; j >= 0; j--){
			if(temp < arr[j]) {
				arr[j + 1] = arr[j]; 
			}else{
				break;
			} 
		}
		arr[j + 1] = temp; 	
	} 
}

//////////////////////////////////////////////////////////////////// 
//堆排序
template <class T>
void Sort::HeapSort(T arr[], int len){
	int i; 
	T buff; 
	T *temp = (T *)malloc(sizeof(T) * (len + 1)); 
	if(temp == NULL){
		cout << "Malloc Error!" << endl;
		exit(1); 
	} 
	for(i = 1; i < len + 1; i++){ //复制数组,使得偏移从1开始,这样好计算左孩子和右孩子坐标 
		temp[i] = arr[i - 1]; 
	}
	
	//建立子堆 
	for(i = len / 2; i >= 1; i--){
		CreateHeap(temp, i, len);
	}
	
	for(i = len - 1; i >= 1; i--){
		buff = temp[1];
		temp[1] = temp[i + 1];
		temp[i + 1] = buff; 
		
		CreateHeap(temp, 1, i); 
	}
	
	for(i = 1; i < len + 1; i++){
		arr[i - 1] = temp[i]; 
	} 
} 

//建立堆 
template <class T>
void Sort::CreateHeap(T arr[], int root, int len){
	int j = 2 * root; 					//root's left child, right (2 * root + 1) 
	T temp = arr[root];
	bool flags = false; 
	
	while(j <= len && !flags){
		if(j < len){
			if(arr[j] < arr[j + 1]){	// Left child is less then right child 
				++j; 					// Move the index to the right child 
			}	
		}
		
		if(temp < arr[j]){
			arr[j / 2] = arr[j];
			j *= 2; 
		}else{
			flags = true; 
		} 
	} 
 	arr[j / 2]  = temp; 
} 

//////////////////////////////////////////////////////////////////// 
//二叉排序树排序 
template <class T>
void Sort::TreeSort(T arr[], int len){
	Node <T>*root = NULL; 
	for(int i = 0; i < len; i++){ 
		root = BuildTree(root, arr[i]);
	}
	
	InTree(root, arr); 
}
 
//建立二叉排序树 
template <class T>
Node<T>* Sort::BuildTree(Node<T>*root, T data){
	Node<T> *tempNode = root;
	Node<T> *parentNode = NULL;
	
	Node<T> *newNode = new Node<T>; 
	newNode->data = data;
	newNode->left = NULL;
	newNode->right = NULL; 
	 
	if(root == NULL){//空树的时候 
		return newNode; 
	}else{
		while(tempNode != NULL){
			parentNode = tempNode;
			if(tempNode->data >= data){
				tempNode = tempNode->left; 
			}else{
				tempNode = tempNode->right; 
			} 
		}
		
		if(parentNode->data >= data){
			parentNode->left = newNode; 
		}else{
			parentNode->right = newNode; 
		} 
	}
	
	return root; 
} 

//中序遍历二叉排序树,将二叉树的节点存储在数组中 
template <class T>
void Sort::InTree(Node<T> *root, T arr[]){
	static int index = 0; 
	if(root != NULL){
		InTree(root->left, arr);
		arr[index++] = root->data;  
		InTree(root->right, arr);
	} 
} 
//////////////////////////////////////////////////////////////////// 
本博客文章除特别声明,全部都是原创!
原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【各种排序算法C++模版类实现】(https://www.iteblog.com/archives/181.html)
喜欢 (3)
分享 (0)
发表我的评论
取消评论

表情
本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!