Сортировка с проверочными методами - C#
Формулировка задачи:
Не вызываются методы, есть ошибка с бесконечным циклом
как исправить?
class Program
{
static void Main(string[] args)
{
TestMethod1();
Tests100Numbers();
//CheckIsSorted();
Tests1000Numbers();
TestEmpty();
TestBig();
}
public static void QuickSort(int[] array, int l, int r)
{
r = array.Length - 1;
l = 0;
int temp;
int x = array[l + (r - l) / 2];
//запись эквивалентна (l+r)/2,
//но не вызввает переполнения на больших данных
int i = l;
int j = r;
//код в while обычно выносят в процедуру particle
while (i <= j)
{
while (array[i] < x) i++;
while (array[j] > x) j--;
if (i <= j)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
if (i < r)
QuickSort(array, i, r);
if (l < j)
QuickSort(array, l, j);
}
public static void TestMethod1()
{
var array = new[] { 3, 2, 1 };
int r = array.Length - 1;
int l = 0;
QuickSort(array, l, r);
if (array[1] < array[0]|| array[2] < array[1])
{
Console.WriteLine("Второй элемент не больше первого");
}
else
{
Console.WriteLine("Сортировка выполнена правильно");
}
}
public static void Tests100Numbers()
{
var array = new int[100];
int r = array.Length - 1;
int l = 0;
for (int i = 0; i < 100; i++)
{
array[i] = 42;
}
QuickSort(array, l, r);
sbyte c = 0;
for (int i = 1; i < 100; i++)
{
if (array[i] < array[i - 1])
c++;
}
if (c != 0)
{
Console.WriteLine("Сортировка работает неправильно");
}
else
{
Console.WriteLine("Сортировка работает правильно");
}
}
public static void CheckIsSorted(int[] array)
{
sbyte c = 0;
for (int i = 0; i < array.Length - 1; i++)
{
if (array[i] < array[i - 1])
c++;
}
if (c != 0)
{
Console.WriteLine("Сортировка работает неправильно");
}
else
{
Console.WriteLine("Сортировка работает правильно");
}
}
public static void Tests1000Numbers()
{
Random rnd = new Random();
var array = new int[1000];
int r = array.Length - 1;
int l = 0;
for (int i = 0; i < 1000; i++)
{
array[i] = rnd.Next();
}
QuickSort(array, l, r);
for (int i = 0; i < 10; i++)
{
int left = 0, right = 0;
left = rnd.Next(1000);
while (left == right)
right = rnd.Next(1000);
if (right < left)
{
var tmp = left;
left = right;
right = tmp;
}
if (array[left] > array[right])
{
Console.WriteLine("Сортировка работает неправильно");
}
else
{
Console.WriteLine("Сортировка работает правильно");
}
}
}
public static void TestEmpty()
{
var array = new int[0];
int r = array.Length - 1;
int l = 0;
QuickSort(array, l, r);
Console.WriteLine();
}
public static void TestBig()
{
var array = new int[50000];
int r = array.Length - 1;
int l = 0;
QuickSort(array, l, r);
sbyte c = 0;
for (int i = 1; i < 50000; i++)
{
if (array[i] < array[i - 1])
c++;
}
if (c != 0)
{
Console.WriteLine("Сортировка работает неправильно");
}
else
{
Console.WriteLine("Сортировка работает правильно");
}
}
}Решение задачи: «Сортировка с проверочными методами»
textual
Листинг программы
using System;
class Program
{
static void Main(string[] args)
{
TestMethod1();
Tests100Numbers();
//CheckIsSorted();
Tests1000Numbers();
TestEmpty();
TestBig();
}
public static void QuickSort(int[] array)
{
if (array.Length < 2) return;
QuickSortInner(array, 0, array.Length - 1);
}
private static void QuickSortInner(int[] array, int l, int r)
{
int x = array[l + (r - l) / 2];
//запись эквивалентна (l+r)/2,
//но не вызввает переполнения на больших данных
int i = l;
int j = r;
//код в while обычно выносят в процедуру particle
while (i <= j)
{
while (array[i] < x) i++;
while (array[j] > x) j--;
if (i <= j)
{
int temp = array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
if (i < r)
QuickSortInner(array, i, r);
if (l < j)
QuickSortInner(array, l, j);
}
public static void TestMethod1()
{
var array = new[] { 3, 2, 1 };
QuickSort(array);
if (array[1] < array[0] || array[2] < array[1])
{
Console.WriteLine("Второй элемент не больше первого");
}
else
{
Console.WriteLine("Сортировка выполнена правильно");
}
}
public static void Tests100Numbers()
{
var array = new int[100];
for (int i = 0; i < 100; i++)
{
array[i] = 42;
}
QuickSort(array);
sbyte c = 0;
for (int i = 1; i < 100; i++)
{
if (array[i] < array[i - 1])
c++;
}
if (c != 0)
{
Console.WriteLine("Сортировка работает неправильно");
}
else
{
Console.WriteLine("Сортировка работает правильно");
}
}
public static void CheckIsSorted(int[] array)
{
sbyte c = 0;
for (int i = 0; i < array.Length - 1; i++)
{
if (array[i] < array[i - 1])
c++;
}
if (c != 0)
{
Console.WriteLine("Сортировка работает неправильно");
}
else
{
Console.WriteLine("Сортировка работает правильно");
}
}
public static void Tests1000Numbers()
{
Random rnd = new Random();
var array = new int[1000];
for (int i = 0; i < 1000; i++)
{
array[i] = rnd.Next();
}
QuickSort(array);
for (int i = 0; i < 10; i++)
{
int left = 0, right = 0;
left = rnd.Next(1000);
while (left == right)
right = rnd.Next(1000);
if (right < left)
{
var tmp = left;
left = right;
right = tmp;
}
if (array[left] > array[right])
{
Console.WriteLine("Сортировка работает неправильно");
}
else
{
Console.WriteLine("Сортировка работает правильно");
}
}
}
public static void TestEmpty()
{
var array = new int[0];
QuickSort(array);
Console.WriteLine();
}
public static void TestBig()
{
var array = new int[50000];
QuickSort(array);
sbyte c = 0;
for (int i = 1; i < 50000; i++)
{
if (array[i] < array[i - 1])
c++;
}
if (c != 0)
{
Console.WriteLine("Сортировка работает неправильно");
}
else
{
Console.WriteLine("Сортировка работает правильно");
}
}
}