Zyava
Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору /*********************************************************************** This code is generated by the AlgoPascal translator This code is distributed under the ALGLIB license (see http://www.alglib.net/copyrules.php for details) ***********************************************************************/ #include "ap.h" void neumansort(ap::real_1d_array& arr, int n); /************************************************************************* Процедура для сортировки массива методом фон Неймана (слияний) Входные параметры: Arr - сортируемый массив. Нумерация элементов от 0 до N-1 N - размер массива Выходные параметры: Arr - массив, упорядоченный по возрастанию. Нумерация элементов от 0 до N-1 *************************************************************************/ void neumansort(ap::real_1d_array& arr, int n) { bool c; int i; int i1; int i2; int n1; int n2; int j; int k; double tmp; ap::real_1d_array barr; int mergelen; barr.setbounds(0, n-1); mergelen = 1; c = true; while(mergelen<n) { if( c ) { i = 0; while(i+mergelen<=n) { i1 = i+1; i2 = i+mergelen+1; n1 = i+mergelen; n2 = i+2*mergelen; if( n2>n ) { n2 = n; } while(i1<=n1||i2<=n2) { if( i1>n1 ) { while(i2<=n2) { i = i+1; barr(i-1) = arr(i2-1); i2 = i2+1; } } else { if( i2>n2 ) { while(i1<=n1) { i = i+1; barr(i-1) = arr(i1-1); i1 = i1+1; } } else { if( arr(i1-1)>arr(i2-1) ) { i = i+1; barr(i-1) = arr(i2-1); i2 = i2+1; } else { i = i+1; barr(i-1) = arr(i1-1); i1 = i1+1; } } } } } i = i+1; while(i<=n) { barr(i-1) = arr(i-1); i = i+1; } } else { i = 0; while(i+mergelen<=n) { i1 = i+1; i2 = i+mergelen+1; n1 = i+mergelen; n2 = i+2*mergelen; if( n2>n ) { n2 = n; } while(i1<=n1||i2<=n2) { if( i1>n1 ) { while(i2<=n2) { i = i+1; arr(i-1) = barr(i2-1); i2 = i2+1; } } else { if( i2>n2 ) { while(i1<=n1) { i = i+1; arr(i-1) = barr(i1-1); i1 = i1+1; } } else { if( barr(i1-1)>barr(i2-1) ) { i = i+1; arr(i-1) = barr(i2-1); i2 = i2+1; } else { i = i+1; arr(i-1) = barr(i1-1); i1 = i1+1; } } } } } i = i+1; while(i<=n) { arr(i-1) = barr(i-1); i = i+1; } } mergelen = 2*mergelen; c = !c; } if( !c ) { i = 1; do { arr(i-1) = barr(i-1); i = i+1; } while(i<=n); } } | Всего записей: 324 | Зарегистр. 04-05-2006 | Отправлено: 23:33 28-02-2007 | Исправлено: Zyava, 23:37 28-02-2007 |
|