再读算法导论,排序一(归并排序)。
来源:互联网 发布:谷歌翻译 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();
}
- 再读算法导论,排序一(归并排序)。
- 再读算法导论关于归并排序
- 【算法导论】归并排序
- [算法导论]归并排序
- 算法导论-----归并排序
- 【算法导论】归并排序
- 算法导论-归并排序
- 算法导论-归并排序
- 算法导论 归并排序
- 算法导论-归并排序
- 《算法导论》--归并排序
- 算法导论--归并排序
- 算法导论 (一)归并排序实现 c++
- C++ 归并排序实现(算法导论)
- C++ 归并排序实现(算法导论)
- 算法导论复习(2) 归并排序
- 算法导论第二章(归并排序)
- 算法导论P17 归并排序
- nyoj-812-水题~~
- action配置中的各项默值
- String s=new String("abc")创建了几个对象?
- 2-02串与数值转换(已更新)拼音查找汉字也是这个原理
- BZOJ 1088 扫雷Mine
- 再读算法导论,排序一(归并排序)。
- HDU4049:Tourism Planning(状态压缩)
- OpenCV+MFC显示图像
- 到底创建了几个String对象?
- 02-03进制的转换_编程(2种格式互转均有代码)
- 初学JBPM。发现的错误JBPM no jBPM DB schema
- action中result的各种转换类型
- 正则表达式初步_分散字符串
- 拥有尊严 (愿与君共勉)