Javascript.RU

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

Визуализация сортировки
Не давно начал учить js и столкнулся с такой проблемой.
Нужно визуализировать сортировку пузырьком.
Но в функции BubbleSort перерисовка массива происходит только после выполнения сортировки, а не во время её исполнения.
Подскажите в чем ошибка и как её исправить.
Набросал следующий код:
<!DOCTYPE html>
<html>
<head>
    <title>Сортировка</title>
    <script src="js/jquery.js"></script>
    <script src="js/sort.js"></script>
</head>
<body>
	<div id="wrap">
		<input type="text" id="min">
		<input type="text" id="max">
		<input type="text" id="n">
		<p class="button Generate">Сгенерировать числа</p>
		<p class="button randomGenerate">Сгенерировать числа рандомно</p>

		<ol class='content'>

		</ol>
	</div>
</body>
</html>


function delay(ms) { 
      // Задаем точки начала измерения 
      var before = after = new Date(); 
      before = before.getTime(); 
      after = after.getTime(); 
      // В цикле меняем вторую точку, сравнивая разницу с аргуметом 
      while (after < before + ms) { 
            after = new Date(); 
            after = after.getTime(); 
      } 
}

function BubbleSort(A){ // отсортировать по возрастанию.
 var n = A.length;
 for (var i = 0; i < n-1; i++){
 	for (var j = 0; j < n-1-i; j++){
 		if (A[j+1] < A[j]){
			var t = A[j+1];
 			A[j+1] = A[j];
 			A[j] = t;
 			UpdatingPoint(A,'ol.content');//Перерисовка массива
 			console.log('Меняем местами :'+A[j+1]+' и '+A[j]);
 			delay(1000);
 		}
 	}
 } 
 return A; // На выходе сортированный по возрастанию массив A.
}

function Rand( min, max,n) {
	var A=[];
	for (var i = 0; i < n; i++) {
		if( max ) {
        	A.push(Math.floor(Math.random() * (max - min + 1)) + min);
    	} else {
    	    A.push(Math.floor(Math.random() * (min + 1)));
    	}
	}
	return A;
}

function GetImp(idImp){
	return Number(document.getElementById(idImp).value);
}

$(function(){
	x1=0;x2=0;
	$('.Generate').click(function(){
		min=GetImp('min');
		max=GetImp('max');
		n=GetImp('n');
		a=Rand(min, max,n);
		UpdatingPoint(a,'ol.content')
	});
	
	$('.randomGenerate').click(function(){
		a=Rand(-100, 100,10);
		UpdatingPoint(a,'ol.content')
	});
});

function SetPoints(A,place){//Отрисовка массива
	for (var i = 0; i < A.length; i++) {
		$(place).append("<li id='p"+i+"'>"+A[i]+"</li>");
	}
}

function DelPoints(place){//Удаление массива
		$(place).empty();
}

function UpdatingPoint(A){
	DelPoints('ol.content');
 	SetPoints(A,'ol.content');
}

Последний раз редактировалось Ensei, 21.07.2017 в 14:46.
Ответить с цитированием
  #2 (permalink)  
Старый 21.07.2017, 14:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от Ensei
function delay
выкинуть и забыть, нет sleep php в js!!! а по теме ищите решение по форуму, есть несколько примеров.

Последний раз редактировалось рони, 21.07.2017 в 14:49.
Ответить с цитированием
  #3 (permalink)  
Старый 21.07.2017, 14:56
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Если делать одновременно сортировку и анимацию, то придется вложенный цикл переколбасить через setTimeout (ну как обычно цикл для асинхронности переделывается).

Функция сортировки будет такая, что хрен разберешь.

Потому есть смысл сначала сохранить копию массива, потом сделать сортировку, в которой записать все "ходы" (каждый ход - пара индексов), а потом уже показать анимацию - там надо будет разворачивать один for, по массиву ходов.
Ответить с цитированием
  #4 (permalink)  
Старый 21.07.2017, 17:09
Новичок на форуме
Отправить личное сообщение для Ensei Посмотреть профиль Найти все сообщения от Ensei
 
Регистрация: 21.07.2017
Сообщений: 3

Сообщение от Alexandroppolus Посмотреть сообщение
сначала сохранить копию массива, потом сделать сортировку, в которой записать все "ходы" (каждый ход - пара индексов), а потом уже показать анимацию - там надо будет разворачивать один for, по массиву ходов.
переписал функцию BubbleSort, но на выходе получаю n одинаковых массивов.
function BubbleSort(A)       // A - массив, который нужно
{                            // отсортировать по возрастанию.
    var n = A.length;
    Steps=[];
    for (var i = 0; i < n-1; i++)
     { for (var j = 0; j < n-1-i; j++)
        { if (A[j+1] < A[j])
           {var t = A[j+1]; A[j+1] = A[j]; A[j] = t; 
           Steps.push(A);
           console.log('Меняем местами :'+A[j+1]+' и '+A[j]);}
        }
     }                     
    return Steps;    // На выходе сортированный по возрастанию массив A.
}


И добавил функцию для их поочерёдной отрисовки, но проблема осталась
function AnimalPaint(Steps){
	N=Steps.length-1;
	for (var i = 0; i < N; i++) {
		setInterval(UpdatingPoint(Steps[i]),1000);
		console.log('Step №'+i);
	}
}
Ответить с цитированием
  #5 (permalink)  
Старый 21.07.2017, 17:37
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Ensei,
Steps.push([j,i]);
Ответить с цитированием
  #6 (permalink)  
Старый 21.07.2017, 21:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Ensei,
function AnimalPaint(Steps){
  UpdatingPoint(Steps.shift());
 if(Steps.length) window.setTimeout(function() {
    AnimalPaint(Steps)
},1000)
}
Ответить с цитированием
  #7 (permalink)  
Старый 21.07.2017, 23:26
Новичок на форуме
Отправить личное сообщение для Ensei Посмотреть профиль Найти все сообщения от Ensei
 
Регистрация: 21.07.2017
Сообщений: 3

Всем спасибо за объяснение без вас бы не разобрался)

В BubbleSort была ещё одна проблема. Строку Steps.push(A);
надо было заменить на Steps.push(A.slice());, чтобы копировалась не ссылка а сам массив.
Ответить с цитированием
  #8 (permalink)  
Старый 21.07.2017, 23:36
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от Ensei
чтобы копировалась не ссылка а сам массив
а зачем вам массив, если нужна только пара?
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сохранить выбранный столбец для сортировки? oleg43 Элементы интерфейса 0 10.07.2017 09:45
Подсчет и вывод количества сравнений в методе быстрой сортировки массива kogenate Общие вопросы Javascript 6 11.06.2016 18:33
Визуализация сортировки. Moterut Javascript под браузер 3 24.01.2012 14:33
Нужен тулкит для сортировки списков cj_spotty Элементы интерфейса 7 31.07.2009 09:27