Си.Сортировка бинарными вставками.Как посчитать количество перестановок и сравнений
Как подсчитать количество перестановок и сравнений правильно?Мне кажется, что я ошиблась.Потому что график выглядит довольно странно. (1 столбец - кол-во элементов в массиве , 2 столбец - среднее значение суммы перестановок и сравнений на массиве из n эл-тов)
Помогите пожалуйста

swaps=0;
comps=0;
for ( i = 1; i < n-1; i++){
x=a[i];
if (x<a[i-1]){
++comps;
left=0;
right= i-1;}
while(left<right){
sred=(left+right)/2;
if (a[ sred]<x){
++comps;
left = sred+1;
}
else right=sred;
}
for ( j = i-1; j < right-1; j++){
a[j+1]=a[j];
a[right]=x;
++swaps;
}
upd:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[]) {
FILE *f=fopen("stat25.csv","w");
int n=100;
int i,s;
while (n<=10000){
int st=0;
for (s=0;s<5;s++)
{
int *a;
a=(int *)malloc(n*sizeof(int));
time_t invocation_time = time(NULL);
srand(invocation_time);
int k;
for (k=0;k<n;k++)
{
a[k] = rand() % 50;
}
int j,comps,swaps,x,right,left,sred;
swaps=0;
comps=0;
for ( i = 1; i < n-1; i++){
x=a[i];
if (x<a[i-1]){
++comps;
left=0;
right= i-1;}
while(left<right){
sred=(left+right)/2;
if (a[ sred]<x){
++comps;
left = sred+1;
}
else right=sred;
}
for ( j = i-1; j < right-1; j++){
a[j+1]=a[j];
a[right]=x;
++swaps;
}
}
st+=swaps + comps;
free(a);
}
st=st/5;
fprintf(f,"%d ; %d\n", n , st);
if (n<1000){
n+=100;}
else {n+=1000;}
}
fclose(f);
return 0;
}
upd 2
swaps=0;
comps=0;
for ( i = 1; i < n; i++)
++comps;
if (a[i-1] > a[i]){
x = a[i];
left = 0;
right = i-1;
do {
sred = (left + right)/2;
++comps;
if (a[sred] < x ) left = sred + 1;
else right = sred - 1;
} while (left <= right);
for ( j = i-1; j>=left; j--)
a[j+1] = a[j];
a[left] = x;
++swaps;
}
Ответы (1 шт):
Автор решения: Павел Ериков
→ Ссылка
Ну основы программирования то надо знать. {} для for нужно написать же. И в последнем моем комментарии я писал, что "где a[...] = ... происходит там считаете swaps". Но вы же добавили ++swaps только после a[left] = x, а как же a[j + 1] = a[j]?
int swaps = 0, comps = 0;
for (int i = 1; i < n; i++) {
++comps;
if (a[i - 1] > a[i]) {
x = a[i];
left = 0;
right = i - 1;
do {
sred = (left + right) / 2;
++comps;
if (a[sred] < x) left = sred + 1;
else right = sred - 1;
} while (left <= right);
for (int j = i - 1; j >= left; j--) {
++swaps;
a[j + 1] = a[j];
}
++swaps;
a[left] = x;
}
}
Удачи при защите этой работы, она вам пригодится!