工作一年了,之前在找工作的时候读过算法导论,之后就没再碰过。
作为一个程序猿,还是需要经常静下心来看看算法。
今天自己敲了下归并排序,竟然敲了快一个小时,看来要常动动算法了。
//AbstractSort.h
#pragma once
#include<iostream>
using namespace std;
/*
** abstract class to define sort operations
**
**
**
**/
class AbstractSort{
public:
AbstractSort(void);
~AbstractSort(void);
protected:
int* arr;
int size;
static const int LARGEINF = 999999999;
public:
virtual void Init(int* arr, int size);
virtual void Sort()=0;
friend ostream& operator << (ostream& out, AbstractSort& obj){
out << "size: "<< obj.size <<endl;
for(int i=0; i<obj.size; i++){
out <<obj.arr[i] <<endl;
}
return out;
}
};
//Abstract.cpp
#include "AbstractSort.h"
AbstractSort::AbstractSort(void)
{
size = 0;
arr= NULL;
}
void AbstractSort::Init(int* ar, int size){
if(size<0){
cout <<"size should bigger than 0!" <<endl;
return;
}
if(ar == NULL){
cout <<"input arr error!"<<endl;
return;
}
arr = new int[size];
this->size = size;
memcpy(arr, ar,sizeof(int)*size);
}
AbstractSort::~AbstractSort(void)
{
if(arr) delete[] arr;
}
//
#pragma once
#include"AbstractSort.h"
class MergeSort:public AbstractSort{
public:
MergeSort(void);
~MergeSort(void);
virtual void Sort();
void merge(int p ,int r, int q); //p-->r sorted, r+1--->q sorted
void ArraySort(int start, int end);
};
//MergeSort.cpp
#include "MergeSort.h"
MergeSort::MergeSort(void){
}
void MergeSort::Sort(){
ArraySort(0,size-1 );
}
void MergeSort::ArraySort(int start, int end){
if(end <=start) return;
int mid = (start+end)/2;
ArraySort(start, mid);
ArraySort(mid+1, end);
merge(start, mid, end);
}
MergeSort::~MergeSort(void){
}
void MergeSort::merge(int p , int m , int q){
int leftSize = m-p+ 2;//contain a senir
int rightSize = q -m +1;
int* leftArray = new int[leftSize];
int* rightArray = new int[rightSize];
memcpy(leftArray, arr+p, leftSize*sizeof(int));
leftArray[leftSize-1] = LARGEINF;
memcpy(rightArray,arr+m+1, rightSize*sizeof(int));
rightArray[rightSize-1] = LARGEINF;
int leftIndex = 0;
int rightIndex = 0;
int index = p;
for(int i=0; i<q-p+1; i++){
if(leftArray[leftIndex]< rightArray[rightIndex]){
arr[index++] = leftArray[leftIndex++];
}else{
arr[index++] = rightArray[rightIndex++];
}
}
delete[] leftArray;
delete[] rightArray;
}
//main.cpp
#include "MergeSort.h"
int main(){
MergeSort mergeS;
int arr[]={1,5,3,2,6,34,32,134,21,123,42,23};
mergeS.Init(arr,sizeof(arr)/sizeof(int));
mergeS.Sort();
cout <<mergeS;
cin.get();
}