Merge-sort
来源:互联网 发布:测试软件工具 编辑:程序博客网 时间:2024/05/21 07:08
#include <stdio.h>#include <iostream>#include <string.h>#define MIN( x, y)( (x)<(y)?(x):(y))typedef int INDEX;typedef class MergeSort { public: MergeSort( void); ~MergeSort( void); bool SetArray( int *array, INDEX left, INDEX right); bool sort( void); bool show( void); private: bool exchange( INDEX a, INDEX b);//exchange between two values bool subsort( int width);//sort this->array with unit of this->width. bool sort2Arr( INDEX arr1, int len1, INDEX arr2, int len2); int *array; int *array_back; INDEX left; INDEX right;} MERGESORT;MergeSort::MergeSort(void){ this->array = NULL; this->array_back = NULL; this->left = 0; this->right = 0;}MergeSort::~MergeSort( void){ if( NULL!=this->array_back) { delete []this->array_back; this->array_back = NULL; }}bool MergeSort::SetArray(int * array,INDEX left,INDEX right){ if( left >= right) { return false; } this->array = array; this->array_back = new int[right-left+1]; this->left = left; this->right = right; return true;}bool MergeSort::sort(void){ if( (this->array==NULL) ||( this->array_back==NULL)) return false; int width = 1; while( width < (this->right - this->left + 1) ) { this->subsort( width);//sort sublists width *= 2; } return true;}bool MergeSort::exchange(INDEX a,INDEX b){ inttmp ; tmp = this->array[a] ; this->array[a] = this->array[b] ; this->array[b] = tmp ; return true;}#if 0static bool ShowArr( int array[], INDEX left, INDEX right){ if( array==NULL) return false; int i; printf(" [left = %3d] ", left); for( i=0; i<( right - left +1); i++) { printf("%4d", array[i]); } printf(" [right = %3d]\n", right ); return true;}#endifbool MergeSort::subsort( int width){ if( width<0) { std::cout<<"warn : "<<__FILE__<<__LINE__<<std::endl; return false; } INDEX cur = this->left; while( cur + width <= this->right) { this->sort2Arr( cur, width, cur + width, MIN( width, this->right-cur-width+1)); cur += 2*width; } memcpy( this->array, this->array_back, (this->right - this->left + 1)*sizeof(int)); return true;}bool MergeSort::sort2Arr(INDEX arr1,int len1,INDEX arr2,int len2){ if( len2<=0) return true; int i1 = 0; int i2 = 0; int i = 0; while( ( i1<len1)&&( i2<len2) ) { if( this->array[arr1 + i1] < this->array[arr2 + i2]) { this->array_back[arr1 + i] = this->array[arr1 + i1]; i1++; i ++; } else { this->array_back[arr1 + i] = this->array[arr2 + i2]; i2++; i++; } } while( i1<len1) { this->array_back[ arr1 + i] = this->array[arr1 + i1]; i++; i1++; } //printf("[i1 = %d, len1 = %d], arr1 = %d \n", i1, len1, arr1); //printf("----------------[i2 = %d, len2 = %d], arr2 = %d \n", i2, len2, arr2); while( i2<len2) { //printf("[ arr1 + i] = %d,\n", arr1+ i); this->array_back[ arr1 + i] = this->array[arr2 + i2]; i++; i2++; } return true;}bool MergeSort::show(void){ if( this->array==NULL) return false; int i; printf(" [left = %3d] ", this->left); for( i=0; i<( this->right - this->left +1); i++) { printf("%4d", this->array[i]); } printf(" [right = %3d]\n", this->right ); return true;}#define ARR_LEN15static int Arr[ARR_LEN] = { 0,1,4,7,2,5,8,3,6,9, 0, 8, 8, 9};int main(){ MERGESORT sort; sort.SetArray( Arr, 0, ARR_LEN-1); sort.show( ); sort.sort( ); sort.show( ); return 0;}
0 0
- Merge Sort
- Merge sort
- merge sort
- merge sort
- merge sort
- Merge Sort
- merge sort
- Merge Sort
- Merge Sort
- merge sort
- Merge Sort
- Merge sort
- Merge-sort
- Merge Sort
- Merge sort
- Merge Sort
- Merge-Sort
- merge sort
- 旋转数组
- rails
- jQuery 的选择器
- 汇率是如何确定的
- SQL SERVER学习笔记:临时表与表变量
- Merge-sort
- c语言中的字符串的定义及初始化和输出
- 我的博客开通了
- 判断该数组是不是某二元查找树的后序遍历的结果
- 我对朴素贝叶斯中文文本分类的理解
- GDP是如何统计出来的
- 链表的基本操作
- “尚未安装.NET Framework 4.0,原因是:HRESULT 0xc8000222” 的 解决办法
- Lucene 工作原理