Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УП Технология программирования.doc
Скачиваний:
20
Добавлен:
11.06.2015
Размер:
1.69 Mб
Скачать

Типичные задачи с массивами: линейная алгебра

Задачи линейной алгебры, такие как сложение матриц и векторов, умножение их на число, скалярное произведение векторов, умножение и транспонирование матриц и др., удобно решать, представляя векторы как одномерные массивы, а матрицы – как двумерные массивы. Из операторов удобно применять цикл for.

Скалярное произведение векторов

На входе векторы a и b раной и ненулевой длины. Функция scalar должна выдать сумму произведений a[i]*b[i] для всех i.

function scalar(a,b)

{var c=0;

for (var i=0; i<a.length; i++)

c += a[i]*b[i];

return c

}

Произведение матриц

Предполагается, что число столбцов первой матрицы равно числу строк второй матрицы и матрицы не ступенчатые. Функция matrProd должна выдать матрицу, элемент c[i][j] которой равен скалярному произведению i-й строки первой матрицы на j-й столбец второй матрицы.

function matrProd(a,b)

{var c=[]; var j,k;

//Цикл по строкам матрицы a

for (var i=0; i<a.length; i++)

{c[i]=[];

//Цикл по столбцам матрицы b

for (j=0; j<b[0].length; j++)

{//Скалярное произведение i-й строки матрицы a

//на j-й столбец матрицы b

c[i][j]=0;

for (k=0; k<b.length; k++)

c[i][j] += a[i][k]*b[k][j]

}

};

return c

}

Транспонирование квадратной матрицы

Исходная матрица изменится, так как транспонирование проводится «на месте» – меняются местами a[i][j]и a[j][i].

function transp(a)

{var j,c;

for (var i=1; i<a.length; i++)

for (j=0; j<i; j++)

{c = a[j][i];

a[j][i] = a[i][j];

a[i][j] = c

};

}

Типичные задачи с массивами: сортировка. Сортировка вставками. Методsort

Сортировкой называется перестановка элементов массива в порядке возрастания или убывания. Простейший и в ряде случаев самый быстрый метод сортировки – сортировка вставками. Алгоритм просматривает массив слева направо и, обнаружив элемент, нарушающий требуемый порядок, переносит его назад в нужное место. Затем продолжает просмотр массива. Ниже описана функция сортировки массива чисел или строк по возрастанию. Она сортирует массив «на месте».

Сортировка вставками

function sortByInsertion(a)

{var j, x;

for (var i=1; i<a.length; i++)

if (a[i-1]>a[i]) // a[i] нарушил порядок

{x = a[i]; j=i; // j – это свободное место

do {a[j]=a[j-1]; j--} //освобождение

while (j!=0 && a[j-1]>x); //места для х

a[j]=x; //вставка х

}

}

Методsort

Стандартный для JavaScript метод sort значительно эффективнее и позволяет сортировать любые массивы, например, массивы массивов и массивы записей, как по возрастанию, так и по убыванию.

Вариант метода без параметра – массив.sort() – применим только для сортировки строк по возрастанию.

Вариант с параметром – массив.sort(имя функции сравнения) – применим в любых случаях, но программист должен сам определить функцию сравнения:

f(a,b){…}, где a и b – произвольные элементы массива. Функция должна выдать число

0, если порядок a и b не играет роли,

<0, если a должно предшествовать b,

>0, если b должно предшествовать a.

Новый массив не создаётся, т.е. сортировка также происходит «на месте».

Примеры функции сравнения

  • Сортировка числового массива по возрастанию function numUp(a,b) { return a-b };

  • Сортировка числового массива по убыванию function numDown(a,b) { return b-a };

  • Сортировка строк числовой матрицы по первому элементу function rowUp(a,b) { return a[0]-b[0] };

  • Сортировка массива строк по убыванию function stringDown(a,b) {if (a<b) return 1; if (a==b) return 0 else return -1 };