void ArrayOutput(int* Arr, int Start, int N)
{
for (int i = Start; i < N; i++)
{
cout << Arr[i] << 'n';
}
getch();
}
Код программы на языке программирования С#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SortLab
{
class Program
{
static void Main()
{
Sort();
}
/*Основная программа*/
static void Sort()
{
int[] myint = { 99,88,77,66,55,44,33,22,11,8,5,3,1};
WriteArray(myint);
ShakerSort(myint);
WriteArray(myint);
Console.ReadLine();
}
/* Шейкер-сортировка */
static void ShakerSort(int[] myint)
{
int beg, end;
int count = 0;
for (int i = 0; i < myint.Length/2; i++) //можно переберать за кол-во итераций, в 2 раза меньше
{ //целочисленное деление округляет в меньшую сторону
beg = 0;
end = myint.Length - 1;
do
{
count += 2;
/* идем спереди */
if (myint[beg] > myint[beg + 1])
Swap(myint,beg,beg+1);
beg++;//сдвигаем позицию вперед
/* идем сзади */
if (myint[end-1] > myint[end])
Swap(myint, end - 1, end);
end--;//сдвигаем позицию назад
}
while (beg <= end);// условия усреднения
}
Console.Write("nКоличество сравнений = {0}n",count);
}
/* Поменять элементы местами */
static void Swap(int[] myint, int i, int j)
{
int glass;
glass = myint[i];
myint[i] = myint[j];
myint[j] = glass;
}
/*Вывести массив*/
static void WriteArray(int[] a)
{
foreach (int i in a)
Console.Write("{0}|", i);
Console.WriteLine("nnn");
}
}
}
Образно алгоритм можно описать так: на каждом шаге основного цикла рассматривается массив a[Left]÷a[Right], после выполнения двух внутренних циклов минимальный и максимальный элемент в исходном массиве перетекают к краям, минимальный в — a[Left], максимальный — в a[Right]. Пусть максимальный элемент имеет индекс k, тогда массив можно изобразить так: a[Left],a[1],..,a[k-1],A[k],a[k+1],..,a[Right];После сравнения A[k] с a[k+1] значение A[k] перейдет в k+1-ую ячейку,после сравнения k+1-ой c k+2-ой – в k+2-eю,и так далее,пока он не сместится в крайне правое положение с индексом Right. Аналогично для минимального. После выполнения цикла по всем подмассивам он отсортируется. Трассировка программы:
3 1 5 8 1 0 4 6 6 7
3 1 5 8 0 1 4 6 6 7
3 1 5 0 8 1 4 6 6 7
3 1 0 5 8 1 4 6 6 7
3 0 1 5 8 1 4 6 6 7
0 3 1 5 8 1 4 6 6 7 Left=1
0 1 3 5 8 1 4 6 6 7
0 1 3 5 1 8 4 6 6 7
0 1 3 5 1 4 8 6 6 7
0 1 3 5 1 4 6 8 6 7
0 1 3 5 1 4 6 6 8 7
0 1 3 5 1 4 6 6 7 8 Right=8
0 1 3 1 5 4 6 6 7 8
0 1 1 3 5 4 6 6 7 8 Left=3
0 1 1 3 4 5 6 6 7 8