Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.09.2017, 17:54
Новичок на форуме
Отправить личное сообщение для d1ver Посмотреть профиль Найти все сообщения от d1ver
 
Регистрация: 25.09.2017
Сообщений: 9

Переинициализация переменной
Всем здравствуйте.
Есть некоторый код:
// ----------------------------------------------
// Функция сортировки вставкой
// ----------------------------------------------
function InsertSort(mass) {
    var x = mass;
    for(let i=1;i<x.length;i++){
        for(let j=i;j>0 && x[j-1]>x[j];j--){ // пока j>0 и элемент j-1 > j, x-массив int
            [x[j-1],x[j]] = [x[j],x[j-1]];   // меняем местами элементы j и j-1
        }
    }     
    return(x);
}
 
// ----------------------------------------------
// Функция сортировки слиянияем
// ----------------------------------------------
function MergeSort(A) {
    function merge_sort(a,low,high) { 
        if (low < high)
        { 
            var mid = Math.floor((low+high)/2);
            merge_sort(a, low, mid);
            merge_sort(a, mid+1, high);
            Merge(a, low, mid, high);
        }
    }
    var n = A.length;
    merge_sort(A, 0, n-1);
    return A;
}
 
// Служебная функция для сортировки слиянием
function Merge(a,low,mid,high) {
    var b = new Array(high+1-low), h, i, j = mid+1, k, h = low, i = 0;
    while (h <= mid && j <= high )
     { 
        if (a[h] <= a[j]) { 
            b[ i ]=a[h]; h++; 
        } else { 
            b[ i ]=a[j]; j++; 
        }
        i++;
     }
    if (h > mid){ 
        for (k = j; k <= high; k++) { 
            b[ i ]=a[k]; i++; } 
        } else { 
            for (k = h; k <= mid; k++) {  
                b[ i ]=a[k]; i++; 
            } 
        }    
    for (k=0; k<=high-low; k++) { 
        a[k+low]=b[k]
    };
    return a;
}
 
// ----------------------------------------------
// Функция быстрой сортировки
// ----------------------------------------------
function QuickSort(items, left = 0, right = items.length - 1) {
    var index;
    if (items.length > 1) {
        index = partition(items, left, right);
        if (left < index - 1) {
            QuickSort(items, left, index - 1);
        }
        if (index < right) {
            QuickSort(items, index, right);
        }
    }
    return items;
}
// ----------------------------------------------
// Функция умной сортировки
// ----------------------------------------------
function SmartSort(items, left = 0, right = items.length - 1) {
    var index;
    if (items.length > 1) {
        let max = right;
        let min = left;
        index = partition(items, left, right, true);
        if (left < index - 1) {
            SmartSort(items, left, index - 1);
        }
        if (index < right) {
            SmartSort(items, index, right);
        }
    }
    return items;
}
 
// Служебная функция для квиксорта и смартсорта
function partition(items, left, right, smart = false) {
    var mid = items[Math.floor((right + left) / 2)];
    var i   = left;
    var j   = right;
 
    if (smart) {
        mid = items[(Math.floor(Math.random() * (right - left + 1)) + left)];
    }
 
    while (i <= j) {
        while (items[i] < mid) {
            i++;
        }
        while (items[j] > mid) {
            j--;
        }
        if (i <= j) {
            [items[i],items[j]]=[items[j],items[i]];
            i++;
            j--;
        }
    }
    return i;
}
 
// ----------------------------------------------
// Служебные функции отладки и вывода результатов
// ----------------------------------------------
 
// случайное заполнение
function random (num) {
    let z = [];
    for (let i = 0; i < num; i++) {
        z.push(parseInt((Math.random()*1000).toFixed(1)));
    }
    return z;
}
// обратный сортированный массив
function back_sorted (num) {
    let z = [];
    for (let i = 0; i < num; i++) {
        z.push(i);
    }
    return z;
}
// сортированный массив
function sorted (num) {
    let z = [];
    for (let i = num; i > 0; i--) {
        z.push(i);
    }
    return z;
}
 
function arr_creater (count, arr_init) {
    var inited_arr = arr_init(count);
    var out_arr = {
        'count': count,
        'init': arr_init.name,
        'out_arr': inited_arr
    };
    return out_arr;
}
// вывод результатов
function test(sort_function, in_arr){
    var name = sort_function.name;
    var mass = in_arr;
    // Date.now - кроссплатформенно
    // // var time_start = Date.now();
    // performance.now() - только некоторые браузеры
 
    var time_start = performance.now();
    var out_arr = sort_function(mass);
    var time_end = performance.now();
    
    
    // // var time_end = Date.now();
    var time = time_end - time_start;
 
    // performance use:
    time = time.toFixed(3);
    var retval = {
    "Функция": name,
    "Время, мс": time,
    "in": in_arr
    };
    return retval;
}
 
function table_test(count, massive_sort){
    var table;
    var mass_obj = arr_creater(count, massive_sort);
    let array = mass_obj.out_arr;
    console.log(array);
 
    table = [test(QuickSort, array), test(SmartSort, array)];
    return table;
}
 
 
console.table(table_test(10, random));

Проблема: после каждого вызова функции test() меняется переменная array.
Как можно исправить?
Необходимо, чтобы вызов каждой функции сортировки внутри table_test(test()) получал один и тот же массив array на вход, массив array задается в функции arr_creater(), вызов которой осуществляется в table_test().
Ответить с цитированием
  #2 (permalink)  
Старый 25.09.2017, 18:39
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

let array1 = array2 = mass_obj.out_arr;
table = [test(QuickSort, array1), test(SmartSort, array2)];
Ответить с цитированием
  #3 (permalink)  
Старый 25.09.2017, 19:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

d1ver,
строка 160
var mass = in_arr.slice(0);
Ответить с цитированием
  #4 (permalink)  
Старый 25.09.2017, 19:35
Новичок на форуме
Отправить личное сообщение для d1ver Посмотреть профиль Найти все сообщения от d1ver
 
Регистрация: 25.09.2017
Сообщений: 9

Белый шум,
Спасибо, но пришлось бы плодить переменные на каждый новый метод сортировки (к тому же пробовал, не вышло).
рони,
Спасибо, как раз то, что нужно!
Не могли бы вы объяснить подробнее, что происходит и почему? (метод slice я погуглю и так)
Был бы очень благодарен.

Последний раз редактировалось d1ver, 25.09.2017 в 19:37.
Ответить с цитированием
  #5 (permalink)  
Старый 25.09.2017, 19:49
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

d1ver,
создаётся копия массива
Ответить с цитированием
  #6 (permalink)  
Старый 25.09.2017, 19:54
Новичок на форуме
Отправить личное сообщение для d1ver Посмотреть профиль Найти все сообщения от d1ver
 
Регистрация: 25.09.2017
Сообщений: 9

То есть js по умолчанию при задании переменной не создает новую, а просто использует ее как адрес?

Т.е.
i = some mass
var mass = i;
mass = mass + 1;

получится, что i = mass + 1 ?
Ответить с цитированием
  #7 (permalink)  
Старый 25.09.2017, 20:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

d1ver,
Объекты: передача по ссылке
Ответить с цитированием
  #8 (permalink)  
Старый 25.09.2017, 20:09
Новичок на форуме
Отправить личное сообщение для d1ver Посмотреть профиль Найти все сообщения от d1ver
 
Регистрация: 25.09.2017
Сообщений: 9

Да, подозревал что-то подобное, но как исправить - не догадывался.
Спасибо большое, рони, вопрос закрыт)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение значения переменной в режиме реального времени The_FactioN jQuery 3 09.03.2016 12:20
посылка переменной kent0026 jQuery 5 04.01.2014 17:34
Как значение переменной вставить в имя переменной? jsgogo Общие вопросы Javascript 3 02.06.2013 12:11
В contains() не подставляется значение переменной Heger jQuery 2 11.12.2011 20:26
Создание переменной по значению другой переменной bahek2462774 Общие вопросы Javascript 2 09.10.2011 10:11