одмогните Уважаемые программисты! Есть прога сортировки для массивов (для данных с произвольным доступом)..
Необходимо реализовать алгоритмы сортировки для данных с последовательным доступом (для списков)
Подправьте пожалуйста!
Как это сделать, помогите!
Код:
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <memory.h>
#pragma hdrstop
//максимальная длина массива
const int maxn=500;
//максимальная величина чисел в массиве
const int maxelement=99;
int ar[maxn+1],br[maxn+1],cr[maxn+1];
int temp[maxn+1];
int kolc,kolm;
int t;
//---------------------------------------------------------------------------
//метод цифровой сортировки
int digits(int size,int* arr)
{
int i, j, k, r, w, uk2, ch;
int MM[10][maxn];//массив для хранения чисел по одному числу
int uk[10];//массив указателей на строки массива ММ
w=maxelement; r=1;
while (1)//цикл для нахождения МАХ разряда чисел исх. массива
{w=(w-w%10)/10;
if (w==0) break;
r++;}
for (k=1;k<=r;k++)//цикл для прогонки чисел по разрядам
{memset(MM,0,sizeof(MM));//обнуляем промежуточный массив
for (i=0;i<=9;i++) {uk[i]=1;}//ставим указатели на 1-е ячейки
for (i=1;i<=size;i++)//в цикле проверяем все числа исх. массива и сортируем по цифре i разряда
{ch=arr[i];
for (j=1;j<k;j++) {ch=(ch-ch%10)/10;}
w=ch%10; kolc++;// !!! считаем кол-во сравнений
MM[w][uk[w]]=arr[i]; kolm++;// !!! считаем кол-во пересылок
uk[w]++;}
uk2=1;//указатель для записи в исходный массив
for (i=0;i<=9;i++)//переписываем числа из промежуточного в исходный массив
{for (j=1;j<uk[i];j++)
{arr[uk2]=MM[i][j]; kolm++;// !!! считаем кол-во пересылок
uk2++;}}}
return 0;
}
//само слияние двух частей массива
int merge(int* arr,int l, int cer,int r)
{
int i=l;
int k=cer+1;
int j=0;
//обнуляем временный массив
memset(temp,0,sizeof(temp));
//сливаем из двух частей в темп наименьший
while (i<=cer && k<=r)
{
kolm++;// !!! считаем кол-во пересылок
kolc++;// !!! считаем кол-во сравнений
if (arr[i]<arr[k]){temp[j]=arr[i]; j++; i++;}
else {temp[j]=arr[k]; j++; k++;}
}
//дописываем из правой части
while (k<=r)
{
kolm++;// !!! считаем кол-во пересылок
temp[j]=arr[k]; j++; k++;
}
//дописываем из левой части
while (i<=cer)
{
kolm++;// !!! считаем кол-во пересылок
temp[j]=arr[i]; j++; i++;
}
//переписываем в массив
for (j=0; j<r-l+1; j++) {arr[l+j]=temp[j]; kolm++;}// !!! считаем кол-во пересылок
return 0;
}
//рекурсивная сортировка слиянием
int sort(int* arr,int l,int r)
{
//l-левая граница , r-правая, она должна быть больше
if (l>=r) return 0;
int cer=(l+r)>>1;//середина отрезка
//сортируем левую и правую чатси
sort(arr,l,cer);
sort(arr,cer+1,r);
//сливаем их
merge(arr,l,cer,r);
return 0;
}
//метод слияния
int sli(int size,int* arr)
{
int i,k,b,c,m;
kolc=0; kolm=0;
sort(arr,1,size);
return 0;
}
#pragma argsused
int main(int argc, char* argv[])
{
randomize();
int n;
//делаем ввод данных
printf("Enter n= ",&n);
scanf("%i",&n);
//все числа случайные
for (int i=1; i<=n; i++)
{ar[i]=random(maxelement+1);
//cout<<i<<"-el="<<ar[i]<<" ";
}
cout<<"\n\n";
//сортируем массив разними методами
memcpy(br,ar,sizeof(ar)); memcpy(cr,ar,sizeof(ar));
//сортируем и выводим количество пересылок и сравнений
digits(n,br); printf("Digits Sort: m=%i c=%i\n",kolm,kolc);
//for (int i=1; i<=n; i++) {cout<<i<<"-el="<<br[i]<<" ";}
cout<<"\n\n";
sli(n,cr); printf("Sli Sort: m=%i c=%i\n",kolm,kolc);
//for (int i=1; i<=n; i++) {cout<<i<<"-el="<<cr[i]<<" ";}
getchar(); getchar();
return 0;
}
С Уважением! Очень надеюсь на вашу помощь...