Сортировка с проверочными методами - 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("Сортировка работает правильно"); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д