Сортировка 2D-массива с помощью метода selection-sort и запись результата в файл

У меня есть задача, и я немного застрял.
Я должен заказать несколько массивов из файла с помощью метода ‘sort sort’ и записать решение в конец файла.
Например:

file.txt
9 3 1 12 8 6
22 3 1 8
78 61 19 5 99

дано. После сортировки у меня должно получиться что-то подобное:

file.txt
9 3 1 12 8 6
22 3 1 8
78 61 19 5 99
----sorted----
1 3 6 8 9 12
1 3 8 22
5 19 61 78 99

Я должен упомянуть, что я должен сделать это на PHP, Java, C # и Python.
Я начал кодировать его в PHP, но я немного застрял. Мой код выглядит так:

<?php

function selectionSort(array $array) {
$length = count($array);
for($i = 0; $i < $length; $i ++) {
$min = $i;
for($j = $i + 1; $j < $length; $j ++) {
if ($array[$j] < $array[$min]) {
$min = $j;
}
}
$tmp = $array[$min];
$array[$min] = $array[$i];
$array[$i] = $tmp;
}
return $array;
}

//CREATE ARRAYS FROM FILE LINES:
$file_handle = fopen("fisier.txt", "r+");

while (!feof($file_handle) ) {

$line_of_text = fgets($file_handle);
$parts = explode(' ', $line_of_text);
$parts_sorted = selectionSort($parts);
for ($n=0; $n<count($parts_sorted); $n++){
echo $parts_sorted[$n]." ";
}

echo "<br>";

}
fclose($file_handle);

Проблема здесь в том, что он плохо сортируется, я имею в виду мой текстовый файл

9 12 5 4 13 8
3 7 12 44 22 4 13
70 1 12 55 34
22 13 7 50 3 1 9 14 27 77
56 2 9 45 35 12 7 63

и результат из кода PHP

4 5 8 9 12 13
13 3 4 7 12 22 44
1 12 34 55 70
1 3 7 77 9 13 14 22 27 50
2 7 9 12 35 45 56 63

что не очень хороший вид Можешь сказать почему?
Знаете ли вы, что мне делать дальше, чтобы записать отсортированные массивы в конец файла?
И небольшая помощь для Java, C # и Python будет здорово. Извините за длинный пост, но я нуб здесь. Спасибо!

1

Решение

fgets () возвращает символ перевода строки / возврата каретки, заканчивающий строку
Так ты не сравниваешь 13 к чему-то, но 13\r\n или же 13\n или же ….

Вы можете сделать что-то вроде

$line_of_text = trim(fgets($file_handle));

избавиться от любого начального / конечного пробела в строке, прочитанной из файла и / или

$parts = array_map('intval', explode(' ', $line_of_text));

преобразовать каждый элемент в целое число.

(Если все элементы находятся в диапазоне значений целого числа php, я советую использовать array_map / intval thingy для сравнения чисел как число очевидно то, что вы хотите. В противном случае вы может быть быть заинтересованным в strnatcmp () в качестве функции сравнения вместо < оператор)

1

Другие решения

Вот короткий фрагмент кода Java.

Что оно делает

  • прочитать файл file.txt построчно
  • преобразовать значения строки в целочисленные значения
  • сортировать целочисленные значения методом selectionSort(int[])
  • записать отсортированные значения обратно в файл file_sorted.txt

.

// equal to your PHP implementation
static void selectionSort(int[] ints) {
for (int i = 0; i < ints.length - 1; i++) {
int min = i;
for (int j = i + 1; j < ints.length; j++) {
if (ints[j] < ints[min]) {
min = j;
}
}
int temp = ints[min];
ints[min] = ints[i];
ints[i] = temp;
}
}

...

Path fileIn = Paths.get("file.txt");
Path fileOut = Paths.get("file_sorted.txt");
try (BufferedReader br = Files.newBufferedReader(fileIn);
BufferedWriter bw = Files.newBufferedWriter(fileOut,
StandardOpenOption.CREATE_NEW)) {
for (String l = br.readLine(); l != null; l = br.readLine()) {
String[] fields = l.split(" +");
int[] ints = Arrays.asList(fields) // convert to List
// convert the List into a Stream
.stream()
// map the entries to their integer values
.mapToInt(f -> Integer.valueOf(f))
// convert the stream to an array
.toArray();
selectionSort(ints);
for (int i = 0; i < ints.length; i++) {
bw.append(Integer.toString(ints[i]));
if (i < ints.length - 1) {
bw.append(' ');
}
}
bw.newLine();
}
}

вход file.txt

9 12 5 4 13 8
3 7 12 44 22 4 13
70 1 12 55 34
22 13 7 50 3 1 9 14 27 77
56 2 9 45 35 12 7 63

выход file_sorted.txt

4 5 8 9 12 13
3 4 7 12 13 22 44
1 12 34 55 70
1 3 7 9 13 14 22 27 50 77
2 7 9 12 35 45 56 63
0

По вопросам рекламы [email protected]