Объяснение:
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "RUSSIAN");
const int n = 5; // (1≤N≤1000)
int mass[n] = { 5, 4, 3, 2, 1 };
int k = 0;
cout << "Исходный массив: ";
for (int i = 0; i < n; ++i)
{
cout << mass[i] << " ";
}
cout << endl;
for (int i = 1; i < n; i++) {
for (int j = 0; j < n-1; j++) {
if (mass[j] > mass[j + 1]) {
int b = mass[j]; // создали дополнительную переменную
mass[j] = mass[j + 1]; // меняем местами
mass[j + 1] = b; // значения элементов
k++;
}
}
}
cout << "Отсортированный массив: ";
for (int i = 0; i < n; ++i)
{
cout << mass[i] << " ";
}
cout << endl << "Kоличество обменов: " << k << endl;
system("pause");
return 0;
}
Оптимизация инвариантных фрагментов кода тесно связана с проблемой оптимального программирования циклов. Внутри цикла могут встречаться выражения, фрагменты которых никак не зависят от управляющей переменной цикла. Их называют инвариантными фрагментами кода. Современные компиляторы часто определяют наличие таких фрагментов и выполняют их автоматическую оптимизацию. Такое возможно не всегда, и иногда производительность программы зависит целиком от того, как запрограммирован цикл. В качестве примера рассмотрим следующий фрагмент программы (язык Turbo Pascal):
for i := 1 to n do
begin
...
for k := 1 to p do
for m := 1 to q do
begin
a[k, m] := Sqrt(x * k * m - i) + Abs(u * i - x * m + k);
b[k, m] := Sin(x * k * i) + Abs(u * i * m + k);
end;
...
am := 0;
bm := 0;
for k := 1 to p do
for m := 1 to q do
begin
am := am + a[k, m] / c[k];
bm := bm + b[k, m] / c[k];
end;
end;
Здесь инвариантными фрагментами кода являются слагаемое Sin(x * k * i) в первом цикле по переменной m и операция деления на элемент массива c[k] во втором цикле по m. Значения синуса и элемента массива не изменяются в цикле по переменной m, следовательно, в первом случае можно вычислить значение синуса и присвоить его вс переменной, которая будет использоваться в выражении, находящемся внутри цикла. Во втором случае можно выполнить деление после завершения цикла по m. Таким образом, можно существенно сократить количество трудоёмких арифметических операций.
[править] Приоритеты оптимизации