再读算法导论,排序一(归并排序)。

来源:互联网 发布:谷歌翻译 mac 编辑:程序博客网 时间:2024/06/03 19:51

工作一年了,之前在找工作的时候读过算法导论,之后就没再碰过。

作为一个程序猿,还是需要经常静下心来看看算法。

今天自己敲了下归并排序,竟然敲了快一个小时,看来要常动动算法了。

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

 

0 0
原创粉丝点击