Всем привет.
Что-то в ступоре. Есть массив чисел 90; 80; 70; 60; 50; 40; 30; 20; 10; -10; -20; -30; -40; -50; -60; -70; -80; -90;
Как данный массив отсортировать для получения результата: 90; -90; 80; -80; 70; -70; 60; -60; 50; -50; 40; -40; 30; -30; 20; -20; 10; -10;
Или подскажите как называется такой метод сортировки?
да. сортируйте все числа (например методом пузырька), только анализируйте их по модулю, НО в сам массив вносите как есть.
у вас получится в большинстве случаев А -А В -В, но иногда -В В -С С
поэтому последним этап просто пройдитесь по массиву и поменяйте местами пары, чтоб справа было отрицательное число.
Определите двухмерный массив b[][]. В первом измерении b[i,0] укажите абсолютное значение, во втором b[i,1] - знак. А потом используйте процедуру ArraySort()
PS Если вы хотите, чтобы сначала шли положительные числа, а затем отрицательные, то это возможно, если вы знаете величину дискретизации. Например, вы имеете дело с ценами. Величина дискретизации Point. Целые числа - величина дискретизации 1.
В первом измерении абсолютные значения увеличиваете для положительных, а для отрицательных уменьшаете, на величину, намного меньшую величины дискретизации.
Что-то у меня не пузырится массив в ни по модулю, ни как-то по другому.
Вот моя реализация задачи:
#property copyright "Copyright © 2010, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" double Array[] = { 50, 40, 30, 20, 10, -10, -20, -30, -40, -50 }; double Array2[]; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start(){ //---- int index = 0; ArrayResize(Array2, ArraySize(Array)); while (ArraySize(Array)!=0){ int x=0; Array2[x] = ArrayMax(Array); index = ArraySearchDouble(Array, Array2[x]); ArrayDeleteDouble(Array, index); Print(Array2[x]); Array2[x] = ArrayMin(Array); index = ArraySearchDouble(Array, Array2[x]); ArrayDeleteDouble(Array, index); Print(Array2[x]); x++; } //---- return(0); } //+------------------------------------------------------------------+ int ArrayDeleteDouble(double& Arr[], int i) { int a, b=ArraySize(Arr); if (i>=0 && i<b) { for (a=i; a<b; a++) Arr[a]=Arr[a+1]; b=ArrayResize(Arr, b-1); return(b); } return(-1); } double ArrayMax(double& Arr[]) { if (ArraySize(Arr)>0) return(Arr[ArrayMaximum(Arr)]); } double ArrayMin(double& Arr[]) { if (ArraySize(Arr)>0) return(Arr[ArrayMinimum(Arr)]); } int ArraySearchDouble(double& Arr[], double e) { for (int i=0; i<ArraySize(Arr); i++) { if (Arr[i]==e) return(i); } return(-1); }
Возможно не идеальный вариант, но рабочий.
Хотя было бы интересно посмотреть коды предложенных вариантов реализации.
IgorM, sergeev, Mislaid если Вас не затруднит напишите свой код в образовательных целях.
Что-то у меня не пузырится массив в ни по модулю, ни как-то по другому.
Вот моя реализация задачи:
Возможно не идеальный вариант, но рабочий.
Хотя было бы интересно посмотреть коды предложенных вариантов реализации.
У Вас и так массив отсортирован. Самый быстрый способ - учесть структуру данных ;) :
double Array[] = { 50, 40, 30, 20, 10, -10, -20, -30, -40, -50 }; double Array2[]; int start() { //---- int aSz = ArraySize(Array); ArrayResize(Array2,aSz); int j=aSz-1; int i=0; for(int k=0;k<aSz;k+=2,i++,j--) { Array2[k] = Array[i]; Array2[k+1] = Array[j]; } //---- for(k=0;k<aSz;k++) { Print( "Array2[",k,"] = ",Array2[k]); } return(0); }
У Вас и так массив отсортирован. Самый быстрый способ - учесть структуру данных ;) :
double Array[] = { 50, -20, -30, 20, 10, -10, 40, -40, -50, 30 };
Если Ваш код применить вот к такому массиву, то сразу не работает.
P.S. Хотя тут наверное моя ошибка, не уточнил, что сортировка должна быть чередование максимум; минимум и т.д. почему-то думалось что это очевидно из приведенного примера.
double Array[] = { 50, -20, -30, 20, 10, -10, 40, -40, -50, 30 };
Если Ваш код применить вот к такому массиву, то сразу не работает.
Вы как задачу поставили ? См пост 1 ....
Есть массив чисел 90; 80; 70; 60; 50; 40; 30; 20; 10; -10; -20; -30; -40; -50; -60; -70; -80; -90; Как данный массив отсортировать для получения результата: 90; -90; 80; -80; 70; -70; 60; -60; 50; -50; 40; -40; 30; -30; 20; -20; 10; -10; Или подскажите как называется такой метод сортировки?
Этот массив double Array[] = { 50, -20, -30, 20, 10, -10, 40, -40, -50, 30 }; предварительно нужно отсортировать - можно стандартным методом - быстрой сортировкой, например......
И, конечно, с произвольным порядком мой код работать не будет - там же учет структуры данных идет.
Удачи.
// Сортировка вектора по абсолютному значению элементов void SortByABS( double& Vector[], int SortType = MODE_ASCEND ) { int i, N = ArraySize(Vector); double Tmp[][2]; ArrayResize(Tmp, N); for (i = 0; i < N; i++) { Tmp[i][0] = MathAbs(Vector[i]); Tmp[i][1] = Vector[i]; } ArraySort(Tmp, 0, 0, SortType); for (i = 0; i < N; i++) Vector[i] = Tmp[i][1]; return; }
Вы как задачу поставили ? См пост 1 ....
Этот массив double Array[] = { 50, -20, -30, 20, 10, -10, 40, -40, -50, 30 }; предварительно нужно отсортировать - можно стандартным методом - быстрой сортировкой например......
Удачи.
Спасибо за пример. Предварительная сортировка спасает ситуацию.
Если будут еще примеры реализации, то постараюсь сравнить все варианты по скорости выполнения, дабы выбрать наиболее быстрый и корректный способ.
Все приведенные коды не рабочие, т.е. не выполняют задачу максимум - минимам - максимум и т.д. если применять к следующему массиву (предварительная сортировка массива тоже не помогает).
double Array[] = { 50.24, -20.18, -30.55, 50.25, -19.18, -10.22, 40.45, -40.79, -50.12, 30.57 };
Мой код пока еще справляется с задачей.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет.
Что-то в ступоре. Есть массив чисел 90; 80; 70; 60; 50; 40; 30; 20; 10; -10; -20; -30; -40; -50; -60; -70; -80; -90;
Как данный массив отсортировать для получения результата: 90; -90; 80; -80; 70; -70; 60; -60; 50; -50; 40; -40; 30; -30; 20; -20; 10; -10;
Или подскажите как называется такой метод сортировки?