public static SeparatedLine[] OrderBy(SeparatedLine[] input) { var array = new SeparatedLine[input.Length]; Array.Copy(input, array, input.Length); return(array.OrderBy(x => x).ToArray()); }
//метод обмена элементов private static void Swap(ref SeparatedLine e1, ref SeparatedLine e2) { var tmp = e1; e1 = e2; e2 = tmp; }
//Сортировка Шелла public static SeparatedLine[] ShellSort(SeparatedLine[] input) { var array = new SeparatedLine[input.Length]; Array.Copy(input, array, input.Length); //расстояние между элементами, которые сравниваются var d = array.Length / 2; while (d >= 1) { for (var i = d; i < array.Length; i++) { var j = i; while (j >= d && array[j - d] > array[j]) { Swap(ref array[j], ref array[j - d]); j -= d; } } d /= 2; } return(array); }
public void Test_ConvertingToString(SeparatedLine input, string result) { //checks ToString Assert.True(input.ToString() == result); //checks explicit converter Assert.True((string)input == result); }
//TODO: Windows && Linux Winner public static SeparatedLine[] QuickSort(SeparatedLine[] input) { var array = new SeparatedLine[input.Length]; Array.Copy(input, array, input.Length); QuickSortIterative(array, 0, input.Length - 1); return(array); }
public static SeparatedLine[] Sort(SeparatedLine[] input) { var array = new SeparatedLine[input.Length]; Array.Copy(input, array, input.Length); Array.Sort(array); return(array); }
public void Test_FromStringToSeparatedLine(string result) { var split = result.Split(". "); var spLine = new SeparatedLine { Number = int.Parse(split[0]), Text = split[1] }; Assert.True(result.GetSeparatedLine() == spLine); }
//сортировка пузырьком public static SeparatedLine[] BubbleSort(SeparatedLine[] input) { var array = new SeparatedLine[input.Length]; Array.Copy(input, array, input.Length); var len = array.Length; for (var i = 1; i < len; i++) { for (var j = 0; j < len - i; j++) { if (array[j] > array[j + 1]) { Swap(ref array[j], ref array[j + 1]); } } } return(array); }
//сортировка вставками public static SeparatedLine[] InsertionSort(SeparatedLine[] input) { var array = new SeparatedLine[input.Length]; Array.Copy(input, array, input.Length); for (var i = 0; i < array.Length - 1; i++) { for (var j = i + 1; j > 0; j--) { if (array[j - 1] > array[j]) { var temp = array[j - 1]; array[j - 1] = array[j]; array[j] = temp; } } } return(array); }
private static IEnumerable <string> FetchData(Random rnd, IReadOnlyDictionary <int, char[]> dictionary, int count, int newLineSize) { //var sb = new StringBuilder(); //slower for 1Gb file: ~14.6s for StringBuilder, string line by line - ~14.06s //var newLine = $"{rnd.Next(0, int.MaxValue)}. {new string(dictionary[rnd.Next(0, count)])}"; //allocates ~3Gb (but less, than SB - ~4Gb) //even with buffer //Encoding.ASCII.GetByteCount(newLine) - slower than newLine.Length //We'll assume that in dictionaries we will be within ASCII symbols (in ASCII 1 char == 1 byte) while (_resultFileSize > 0) { //for 1Gb file: 9.422s with that, allocates ~3Gb, but faster because of operations on stack var separatedLine = new SeparatedLine { Number = rnd.Next(0, int.MaxValue), Text = dictionary[rnd.Next(0, count)] }; _resultFileSize -= newLineSize + separatedLine.GetLength(); yield return(separatedLine.ToString()); } }
//сортировка перемешиванием public static SeparatedLine[] ShakerSort(SeparatedLine[] input) { var array = new SeparatedLine[input.Length]; Array.Copy(input, array, input.Length); for (var i = 0; i < array.Length / 2; i++) { var swapFlag = false; //проход слева направо for (var j = i; j < array.Length - i - 1; j++) { if (array[j] > array[j + 1]) { Swap(ref array[j], ref array[j + 1]); swapFlag = true; } } //проход справа налево for (var j = array.Length - 2 - i; j > i; j--) { if (array[j - 1] > array[j]) { Swap(ref array[j - 1], ref array[j]); swapFlag = true; } } //если обменов не было выходим if (!swapFlag) { break; } } return(array); }