Прочитал пост, не удержался, написал быстренько все на java, с примерными замерами времени (разница System.time.currentTimeMillis() до и после вызова метода сортировки).
Результаты следующие.
«Глупая» сортировка зависает на неопределенное время на размере массива около 3000 элементов. На 2000 показывает время примерно 1600 мс.
«Пузырьковая» ведет себя лучше — около 25 мс на размере 2000 элементов. На 30 000 элементов — 2700 мс, почти три секунды.
«Шейкерная» сортировка — на размере 2000 элементов такие же, даже немного хуже (спишем на статистику) результаты. А вот на 30000 элементов разница в два раза — 1200 мс.
«Гребешковая» сортировка меня удивила. Я ожидал, что будет быстрее, но не на столько же! 2000 элементов — 11 мс. 30 000 элементов — 26 мс. 30 000 000 — 5500 мс.
Для сравнения — Arrays.sort(): 3000 элементов — 14-15 мс, 30000 — 30-40 мс, 30 000 000 — 3400 мс.
Вы заметили, что «гребешковая» сортировка получилась быстрее стандартной джавы? Меня это заинтересовало, и я начал увеличивать размер массива, и сравнивать результаты «гребешка» и Arrays.sort(). Получилось, что до 1 500 000 элементов «гребешок» быстрее, а вот дальше уже стандартная сортировка начинает работать быстрее.
Вот такие вот результаты :) Приятно, что реализация «гребешковой» сортировки тривиальна — можно реально использовать на небольших массивах с реальной пользой.
Кому интересно, привожу «тестовую лабораторию»:
Немного дурно пахнущего кода
package com.webprestige.winter.wallpaper;
import java.util.Random;
public class DesktopStarter {
public static void main(String[] args) {
int size = 30000000;
Random r = new Random();
int[] v = new int[size];
for (int i = 0; i < size; v[i++] = r.nextInt(10000));
long time = System.currentTimeMillis();
coolSort(v);
long endTime = System.currentTimeMillis();
System.out.println("Time is " + (endTime - time));
// for(int i = 0; i < size; i++) {
// System.out.print(v[i] + " ");
// }
}
private static void stupidSort(int[] v) {
boolean end = false;
while (!end) {
end = true;
for (int i = 0; i < v.length - 1; i++) {
if (v[i] > v[i + 1]) {
int t = v[i];
v[i] = v[i + 1];
v[i + 1] = t;
end = false;
break;
}
}
}
}
private static void bulbSort(int[] v) {
boolean end = false;
while (!end) {
end = true;
for (int i = 0; i < v.length - 1; i++) {
if (v[i] > v[i + 1]) {
int t = v[i];
v[i] = v[i + 1];
v[i + 1] = t;
end = false;
}
}
}
}
private static void shakeSort(int[] v) {
boolean end = false;
while (!end) {
end = true;
for (int i = 0; i < v.length - 1; i++) {
if (v[i] > v[i + 1]) {
int t = v[i];
v[i] = v[i + 1];
v[i + 1] = t;
end = false;
}
}
for (int i = v.length - 1; i > 0; i--) {
if (v[i] < v[i - 1]) {
int t = v[i];
v[i] = v[i - 1];
v[i - 1] = t;
end = false;
}
}
}
}
public static void coolSort(int[] v) {
float loadFactor = 1.247f;
int step = v.length;
boolean end = false;
int t;
while (!end) {
end = true;
step /= loadFactor;
if (step < 1) {
step = 1;
}
for (int i = 0; i < v.length - 1; i++) {
if ((i + step) < v.length) {
if (v[i] > v[i + step]) {
t = v[i];
v[i] = v[i + step];
v[i + step] = t;
end = false;
}
} else {
end = false;
}
}
}
}
}
Хм, у меня такая проблема возникла. Картинка загружалась из интернета, после чего на ее месте был белый прямоугольник. Формат картинки — jpeg. Может, конечно, бага движка. В любом случае, после изменения размеров на 512*512 проблема пропала. Замечу, что данная трабла была только на телефоне — на компьютере грузило нормально любые размеры.
Эм, про это я даже не задумывался) мне давали дизайн, я писал код. Вообще большинство этих изображений можно найти в интернете в свободном доступе. Думаю, вряд ли правообладатели будут предьявлять какие-либо претензии :)
Тоже думали, но отказались, потому что обделили бы пользователей с планшетом(еще выпадет, разобьется:) ). Также немного проблематично было бы играть в маршрутках, авто и т. д. — там, где все трясется
Кстати, была одно время идея сделать вместо полоски выбивания в игровом экране управление акселерометром — типо кружок, и в него нужно попасть точкой. Точка убегает, а вы акселерометром ловите ее. В итоге отказались, подумали, что будет слишком сложно для игрока\длинно :)
Блин, вот скажите мне, эти все дайджесты — они действительно кому-то нужны? Они несут какую-то полезную информацию, которую никак иначе кроме вот этих вот дайджестов нельзя было получить? Я понимаю на каком-то новостном сайте, но не Хабре же!
Как по мне, прекрасная статья, отличный обзор, как нужно и как не нужно строить ИИ в играх. Во всяком случае, намного лучше всяких «дайджестовновостей», которые периодически появляются на хабре.
Автор пишет — 10 минут в день. Я, когда начинал писать, програмил по 5-6 часов в день, и меня это не утомляло. ИМХО, 10 минут — это не хватит даже нормально войти в контекст задачи, пару часов в день — что-то более похоже на правду. За мотивацию — если для Вас главное деньги — нормальным программистом вам не стать. Деньги могут быть дополнительным стимулом, но если Вы не фанатеете от процесса — можно и не начинать. От таких 10-минутников обычно получаются программисты, которые напишут «Hello world», но если им сказать вывести эту фразу 10 раз — они вместо цикла и выведут ее 10 раз. Еще раз повторю главную мысль — если Вы чувствуете удовольствие от процесса — Вы не будете замечать течения времени. Если же нет — найдите себе другую сферу деятельности.
P. S. А за велосипеды — да, поддерживаю. Помню, как радовался, когда на паскале заставил двигаться пиксель по экрану клавишами курсора. Это был еще тот велосипед:)
Для меня сложно работать блоками. Ведь вдохновение не приходит в определенное время. На своем опыте я убедился, что нужно делать реальные проекты — пусть далее они нужны только вам. Здесь появится и вдохновение, и желание работать. И, конечно, отличный стимулирующий фактор — соревнование. Например, в последних классах школы я и товарищи записали на асм-контестах. Да, задачи были синтетические, но были соревнования, было интересно.
Да, вместо трех проектов — главный, настольный ПК и андроид — всего один — для запуска на ПК. Это сделано с целью упрощения, чтобы не связывать три проекта вместе. Переделка для запуска на андроид по первому туториалу займет пять минут.
Результаты следующие.
«Глупая» сортировка зависает на неопределенное время на размере массива около 3000 элементов. На 2000 показывает время примерно 1600 мс.
«Пузырьковая» ведет себя лучше — около 25 мс на размере 2000 элементов. На 30 000 элементов — 2700 мс, почти три секунды.
«Шейкерная» сортировка — на размере 2000 элементов такие же, даже немного хуже (спишем на статистику) результаты. А вот на 30000 элементов разница в два раза — 1200 мс.
«Гребешковая» сортировка меня удивила. Я ожидал, что будет быстрее, но не на столько же! 2000 элементов — 11 мс. 30 000 элементов — 26 мс. 30 000 000 — 5500 мс.
Для сравнения — Arrays.sort(): 3000 элементов — 14-15 мс, 30000 — 30-40 мс, 30 000 000 — 3400 мс.
Вы заметили, что «гребешковая» сортировка получилась быстрее стандартной джавы? Меня это заинтересовало, и я начал увеличивать размер массива, и сравнивать результаты «гребешка» и Arrays.sort(). Получилось, что до 1 500 000 элементов «гребешок» быстрее, а вот дальше уже стандартная сортировка начинает работать быстрее.
Вот такие вот результаты :) Приятно, что реализация «гребешковой» сортировки тривиальна — можно реально использовать на небольших массивах с реальной пользой.
Кому интересно, привожу «тестовую лабораторию»:
P. S. А за велосипеды — да, поддерживаю. Помню, как радовался, когда на паскале заставил двигаться пиксель по экрану клавишами курсора. Это был еще тот велосипед:)