Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
4 / 4 / 3
Регистрация: 22.09.2015
Сообщений: 29

Написать функцию, аналогичную библиотечной функции Asort($array)

22.09.2015, 23:51. Показов 1506. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать функцию аналогичную данной библиотечной функции.(Желательно еще и с демонстрацией работы).
Использование библиотечных функций в теле данной функции запрещено.
Может можно где взять?
Добавлено через 43 минуты
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
function mass_sort($array)
{
   //в $array будем сохранять результат, поэтому анализировать будем его копию 
   $arr=$array;
   //считаем количество элементов
   $res=count($array);
   //создаем массив с пустыми ячейками и ключами от 0 до ($res-1)
   //аналогично $array=array_fill ( 0 , $res , "");
      unset($array);
      for($i=0; $i<$res; $i++)
      {
         $array[$i]="";
      }   
   //берем элементы массива по порядку сравниваем их с элементами этого же 
   //массива и копируем в изначальный на своё место. если занято, то на соседнее.
     foreach($arr as $key=>$value)
        {
        $key1=0;
        foreach($arr as $value1)
          {           
           if($value>$value1)
             {
             $key1++;
             }
          }
            while ($array[$key1]!=="") {
      $key1++; 
      }
                  $array[$key1]=$arr[$key];             
        }
 
     
}
Добавлено через 10 минут
что-то не работает.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2015, 23:51
Ответы с готовыми решениями:

Написать функцию, аналогичную функции strcspn
Подскажите, как написать функцию в С++, аналогичную функции strcspn(функцию определения длины той части 1-ой строки , которая не содержит...

Написать функцию аналогичную getline, средствами с++
Функция которая ничего не возвращает, принимает 2 аргумента: поток, и ссылку на стоку. Не знаю как реализовать средствами с++.

Написать функцию аналогичную методу .toLocaleString('ru-RU')
Доброго вечора допоможіть буд-ласка я новачок в JS потрібно реалізувати таку річ : Написати функцію яка буде працювати аналогічно тому як...

3
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
23.09.2015, 00:21
Лучший ответ Сообщение было отмечено RedBrandt как решение

Решение

Цитата Сообщение от RedBrandt Посмотреть сообщение
Может можно где взять?
Сильно сомневаюсь Разве что вытянуть из сорцов и переписать на PHP, но если никогда не программировали на C/C++, будет тяжко..
Ну а вообще, если в лоб, то можно написать следующим образом:
1) Получаете массив значений.
2) Берете любой алгоритм сортировки (какой хотите - сортировка вставками, пузырьковая, быстрая..).
3) Сортируете массив значений.
4) Формируете новый массив, отталкиваясь от полученного отсортированного массива со значениями и изначального.
5) Заменяете исходный массив.
Навскидку, что-то наподобие такого (я взял сортировку вставками, т.к., имхо, это самый простой алгоритм)

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function searchValue(array $arr = array(), $val)
{
    foreach($arr as $k=>$v)
        if($v === $val)
            return $k;
    return false;
}
 
function myAsort(array &$arr = array())
{
    $cnt = 0;
    foreach($arr as $value)
    {
        $values[] = $value;
        ++$cnt;
    }
 
    for($i = 1; $i < $cnt; ++$i)
    {
        for($j = $i; $j > 0 && $values[$j-1] > $values[$j]; --$j)
        {
            $tmp = $values[$j - 1];
            $values[$j - 1] = $values[$j];
            $values[$j] = $tmp;
 
        }
    }
    $newArr = [];
    foreach($values as $v)
        $newArr[searchValue($arr, $v)] = $v;
    $arr = $newArr;
}
Из минусов данного подхода - громоздкость и сложность (как вычислительная, так и "визуальная"). Можно несколько исправить данный алгоритм, введя дополнительный массив для ключей
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function myAsort(array &$arr = array())
{
    $cnt = 0;
    foreach($arr as $key=>$value)
    {
        $keys[] = $key;
        $values[] = $value;
        ++$cnt;
    }
 
    for($i = 1; $i < $cnt; ++$i)
    {
        for($j = $i; $j > 0 && $values[$j-1] > $values[$j]; --$j)
        {
            $tmpIndex = $j - 1;
 
            $tmp = $values[$tmpIndex];
            $values[$tmpIndex] = $values[$j];
            $values[$j] = $tmp;
 
            $tmp = $keys[$tmpIndex];
            $keys[$tmpIndex] = $keys[$j];
            $keys[$j] = $tmp;
 
        }
    }
 
    $arr = [];
 
    for($i = 0; $i < $cnt; ++$i)
        $arr[$keys[$i]] = $values[$i];
}
Пример работы есть тут http://ideone.com/k5mbGx
код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
 
function myAsort(array &$arr = array())
{
    $cnt = 0;
    foreach($arr as $key=>$value)
    {
        $keys[] = $key;
        $values[] = $value;
        ++$cnt;
    }
 
    for($i = 1; $i < $cnt; ++$i)
    {
        for($j = $i; $j > 0 && $values[$j-1] > $values[$j]; --$j)
        {
            $tmpIndex = $j - 1;
 
            $tmp = $values[$tmpIndex];
            $values[$tmpIndex] = $values[$j];
            $values[$j] = $tmp;
 
            $tmp = $keys[$tmpIndex];
            $keys[$tmpIndex] = $keys[$j];
            $keys[$j] = $tmp;
 
        }
    }
 
    $arr = [];
 
    for($i = 0; $i < $cnt; ++$i)
        $arr[$keys[$i]] = $values[$i];
}
 
 
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
myAsort($fruits);
var_export($fruits);


Добавлено через 55 секунд

Не по теме:

Цитата Сообщение от RedBrandt Посмотреть сообщение
PHP
1
$res=count($array);
а я думал, что count тоже является библиотечной функцией.. :scratch:



Добавлено через 9 минут
З.Ы. Вот с комментами
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function myAsort(array &$arr = array())
{
    //количество элементов в массиве
    $cnt = 0;
    //пробегаемся по массиву и разбиваем его на два массива (с ключами и со значениями)
    foreach($arr as $key=>$value)
    {
        //ключи
        $keys[] = $key;
        //значения
        $values[] = $value;
        //инкрементируем счетчик количества элементов
        ++$cnt;
    }
 
    //пробегаемся по массиву значений (и, заодно, меняем массив ключей)
    for($i = 1; $i < $cnt; ++$i)
    {
        // пока индекс $j больше нуля
        //и строка под индексом $j-1 больше строки под индексом $j
        for($j = $i; $j > 0 && $values[$j-1] > $values[$j]; --$j)
        {
            //индекс предыдущего элемента
            $tmpIndex = $j - 1;
 
            //меняем элементы с этими индексами в массиве значений местами
            $tmp = $values[$tmpIndex];
            $values[$tmpIndex] = $values[$j];
            $values[$j] = $tmp;
 
            //меняем элементы с этими индексами в массиве ключей местами
            $tmp = $keys[$tmpIndex];
            $keys[$tmpIndex] = $keys[$j];
            $keys[$j] = $tmp;
 
        }
    }
 
    //"обнуляем" массив
    $arr = [];
 
    //заполняем новыми отсортированными значениями
    for($i = 0; $i < $cnt; ++$i)
        $arr[$keys[$i]] = $values[$i];
}
1
4 / 4 / 3
Регистрация: 22.09.2015
Сообщений: 29
24.09.2015, 00:49  [ТС]
что-то у меня строка 40 не пошла,я поставил "" вместо []
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//функция для сортировки asort($mas);
 function mass_sort(array &$array = array())
{
   //количество элементов в массиве
    $res = 0;
    //пробегаемся по массиву и создаем три массива (для ключей, значений и проверки на совпадение)
    foreach($array as $key=>$value)
    {
        $keys[] = $values[] = $arr[] = "";
        //инкрементируем счетчик количества элементов
        ++$res;       
    }
   //берем элементы массива по порядку сравниваем их с элементами этого же 
   //массива и копируем в проверочный на своё место. если занято, то на соседнее.
     foreach($array as $key=>$value)
        {
        $key1=0;
        foreach($array as $value1)
          {           
           if($value>$value1)
             {
             $key1++;
             }
          }
            while ($arr[$key1]!=="") 
            {
            $key1++; 
            }
                  $arr[$key1]=$array[$key];
                  $values[$key1] = $value;
                  $keys[$key1] = $key;             
        }
    //"обнуляем" массив
    $array = "";
     //заполняем новыми отсортированными значениями
    for($i = 0; $i < $res; ++$i)
        $array[$keys[$i]] = $values[$i];
 }
На основании мыслей гуру написал свой.(Неловко как-то чужое за своё выдать).
Стоит ли его еще оптимизировать? Если да, то как? Или он вообще никакой и надо взять чужой? Я в правилах и этикете программирования полностью прозрачный. Последний раз писал на ЯМБе и очень давно.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
24.09.2015, 01:00
Лучший ответ Сообщение было отмечено RedBrandt как решение

Решение

Цитата Сообщение от RedBrandt Посмотреть сообщение
что-то у меня строка 40 не пошла,я поставил "" вместо []
это у вас наверное версия PHP старая, надо было заменить "[]" на "array()".

По поводу оптимизации - разница может и небольшая, но чисто теоретически, у вас два вложенных цикла (foreach + while) в одном вместо одного. По поводу использования кода - берите любой, главное ведь, чтобы задача была выполнена

Добавлено через 6 минут
Если навскидку, по скорости получается примерно так

Code
1
2
3
4
5
6
Benchmark: timing 1_500_000 iterations of myAsort, mass_sort
 
 function : total sec. @ iterations/sec.
-----------------------------------------
 myAsort  :    10.2108 @      146903.2078
 mass_sort:    10.8722 @      137966.7625
код
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?php
 
function myAsort(array &$arr = array())
{
    //количество элементов в массиве
    $cnt = 0;
    //пробегаемся по массиву и разбиваем его на два массива (с ключами и со значениями)
    foreach($arr as $key=>$value)
    {
        //ключи
        $keys[] = $key;
        //значения
        $values[] = $value;
        //инкрементируем счетчик количества элементов
        ++$cnt;
    }
 
    //пробегаемся по массиву значений (и, заодно, меняем массив ключей)
    for($i = 1; $i < $cnt; ++$i)
    {
        // пока индекс $j больше нуля
        //и строка под индексом $j-1 больше строки под индексом $j
        for($j = $i; $j > 0 && $values[$j-1] > $values[$j]; --$j)
        {
            //индекс предыдущего элемента
            $tmpIndex = $j - 1;
 
            //меняем элементы с этими индексами в массиве значений местами
            $tmp = $values[$tmpIndex];
            $values[$tmpIndex] = $values[$j];
            $values[$j] = $tmp;
 
            //меняем элементы с этими индексами в массиве ключей местами
            $tmp = $keys[$tmpIndex];
            $keys[$tmpIndex] = $keys[$j];
            $keys[$j] = $tmp;
 
        }
    }
 
    //"обнуляем" массив
    $arr = [];
 
    //заполняем новыми отсортированными значениями
    for($i = 0; $i < $cnt; ++$i)
        $arr[$keys[$i]] = $values[$i];
}
function mass_sort(array &$array = array())
{
   //количество элементов в массиве
    $res = 0;
    //пробегаемся по массиву и создаем три массива (для ключей, значений и проверки на совпадение)
    foreach($array as $key=>$value)
    {
        $keys[] = $values[] = $arr[] = "";
        //инкрементируем счетчик количества элементов
        ++$res;
    }
   //берем элементы массива по порядку сравниваем их с элементами этого же
   //массива и копируем в проверочный на своё место. если занято, то на соседнее.
     foreach($array as $key=>$value)
        {
        $key1=0;
        foreach($array as $value1)
          {
           if($value>$value1)
             {
             $key1++;
             }
          }
            while ($arr[$key1]!=="")
            {
            $key1++;
            }
                  $arr[$key1]=$array[$key];
                  $values[$key1] = $value;
                  $keys[$key1] = $key;
        }
    //"обнуляем" массив
    $array = "";
 
    //заполняем новыми отсортированными значениями
    for($i = 0; $i < $res; ++$i)
        $array[$keys[$i]] = $values[$i];
 
}
 
function timethese($count, array $functions)
{
    if (!$functions)
        throw new LogicException("No callback function specified");
 
    $names = array_keys($functions);
    $width = max(max(array_map('strlen', $names)), 8);
 
    printf("Benchmark: timing %s iterations of %s" . PHP_EOL, number_format($count, 0, "", "_"), join(", ", $names));
    echo PHP_EOL;
    printf(" %-{$width}s: %10s @ %s", "function", "total sec.", "iterations/sec.");
    echo PHP_EOL, "------", str_repeat("-", $width + 10 + 16), PHP_EOL;
    foreach ($functions as $name => $function) {
        printf(" %-{$width}s: ", $name);
        $start = microtime(true);
        for ($i = 0; $i < $count; $i++)
            $function();
 
        $total = microtime(true) - $start;
        printf("%10.4F ", $total);
        if ($total >= 0.0001)
            printf("@ %16.4F", $count / $total);
        else
            echo "! Too few inerations";
 
        echo PHP_EOL;
    }
}
 
timethese(1500000, array(
    'myAsort' => function() {
        $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
        myAsort($fruits);
    },
    'mass_sort' => function() {
        $fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
        mass_sort($fruits);
    },
));
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2015, 01:00
Помогаю со студенческими работами здесь

Напишите функцию, аналогичную функции SUBST
Напишите функцию: аналогичную функции SUBST , но в которой третий аргумент W обязательно должен быть списком; Спасибо.

Составить пользовательскую функцию, аналогичную функции МЕСЯЦ в Excel
Помогите, составить пользовательскую функцию, аналогичную функции МЕСЯЦ в Excel. Возвращает месяц для даты, заданной в числовом формате,...

Напишите функцию, аналогичную встроенной функции замены subst в списке s взаимную замену x на y
Напишите функцию, аналогичную встроенной функции замены subst в списке s выражения x на y, но производящую взаимную замену x на y, т.е....

Необходимо заменить функцию ДАТАМЕС на свою аналогичную функцию
Всем Здравствуйте.. Уже спрашивала этот вопрос, но прога не прокатила.. Необходимо заменить функцию ДАТАМЕС на свою аналогичную...

Необходимо заменить функцию ДАТАМЕС на свою аналогичную функцию
Всем Добрый Вечер! Если кто то знает,прошу подсказать.. Необходимо заменить функцию ДАТАМЕС на свою аналогичную функцию, но не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru