Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / сортировка небольших массивов / 25 сообщений из 32, страница 1 из 2
06.10.2006, 16:55
    #34038487
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Как наиболее быстро отсортировать массив типа int[N] при следующих значениях N
1..10; 20..100; 100...5000;
Понятно, что тут Qsort не рулит вообще
...
Рейтинг: 0 / 0
06.10.2006, 16:56
    #34038493
zz118
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
быстрее Хора, вроде, ничего не придумано.
...
Рейтинг: 0 / 0
06.10.2006, 17:19
    #34038584
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Зависит от природы самой предметной области ИМХО.

Иногда дешевле поддерживать структуру данных в постоянно-отсортрованом виде (Б-дерево).
...
Рейтинг: 0 / 0
07.10.2006, 10:34
    #34039248
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Хоар хорош, когда данных для сортировки достаточно много, скажем порядка >1000. А иначе при сортировке 15 элементов времени тратится значительно больше, чем даже вставкой. Шелл тоже не оптимален, хотя и быстрее.А это надо как раз для оптимизации сотритовки большого количества небольших массивов. например после неполного Хоара можно отсортировать его подгруппы зночительно быстрее, если не до конца сортировать им, а после порога в 100 элементов перейти на что-то быстрее. Это же легко понять, если оценить поведение Qsort на данных
Допустим, у нас кол-во элементов есть 2^10 и мы подразбиваем интервал на ранные группы. Итого имеем после 5 проходов 32 группы по 32 элемента. Ну и зачем нам далее вызывать Qsort(Хоар) 160 раз, если можно 32 раза ту же вставку. Притом на этом этапе(последнем) тратится примерно 50% производительности, что малоприемлимо(!). Вот и стоит вполне фундаментальная проблема именно сортировки большого количества небольших групп элементов за минимальное алгоритмическое время!
...
Рейтинг: 0 / 0
07.10.2006, 11:14
    #34039277
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Правильно сказал zz118. Но, Хоар удобен, когда мы имеем random-access ко всем элементам массива и среднее время доступа=const. Если вносить дополнительные условия (блочное чтение данных с диска, влияние кеша второго уровня), то можно использовать различные оптимизации.

Замечу, что Хоар хорош в чистой теории. На практике (для очень больших массивов) можно использовать комбинацию методов. Например - "Хоар" + "Ленточное Слияние".
...
Рейтинг: 0 / 0
07.10.2006, 11:21
    #34039280
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Добавлю. Для массивов размером 2-3 элемента вполне подойтет метод "Пузыря". И нечего здесь стеснятся.
...
Рейтинг: 0 / 0
07.10.2006, 12:06
    #34039313
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Ну а для 100 элементов как?
...
Рейтинг: 0 / 0
07.10.2006, 12:42
    #34039341
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Den_di!

Судя по вашему второму посту вы неплохо разобрались в самой предментной области сортировок. Я думаю, что вы сами в состоянии ответить на ваш вопрос. Проведите ряд экспериметов. С различными исходными условиями. Сделайте табличку:

Размер массива/группыМетодСреднее время (сек)1000Хоар?100/10Хоар+Шелл?1000/100Хоар+Шелл?

Я думаю, что скрулистам будет интересно узнать реальные цифры оценок времени работы.

P.S. Еще наблюдение: Хоар ведет себя по разному на различных исходных раскладах массива.
...
Рейтинг: 0 / 0
07.10.2006, 13:03
    #34039360
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
mayton Спасибо за доверие.
Если кто не знает, Хоар далеко не самый быстрый алгоритм. Есть несколько простых и намного более быстрых алгоритмов. Например поразрядная сортировка и сортировка слиянием (merge sort). Ассимптотика у них всегда N и дополнительная память им не нужна(ну не считать же 400Kb дополнительных). Если кому интересно, могу выложить исходник моей реализации. Но опять же они намного быстрее пузырька только при большом количестве элементов.
Для Хоара порог оптимальности чде-то порядка 70-80 элементов а потом сортировка вставкой.(30% выигрыша). Но как гарантированно найти самый быстрый алгоритм при небольшом количестве элементов.
...
Рейтинг: 0 / 0
07.10.2006, 13:12
    #34039367
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Den_diЕсли кому интересно, могу выложить исходник моей реализации.

Ну.. если не затруднит. Был-бы признателен.
...
Рейтинг: 0 / 0
07.10.2006, 15:28
    #34039480
Aklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
насколько помню кроме бинарного дерева нет стабильных алгоритмов n*log(n)

аффтопитезь
...
Рейтинг: 0 / 0
07.10.2006, 15:48
    #34039503
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
maytonДобавлю. Для массивов размером 2-3 элемента вполне подойтет метод "Пузыря". И нечего здесь стеснятся.
Тут нужна аккуратность. Помнится, на первом курсе параллельному потоку дали курсовую по методам сортировки, и я по этому поводу дал знакомой девчонке распечатку реализации qsort-а - ту, которая шла в демках к пятому паскалю. Вдруг она жалуется - мол, работает медленнее пузырька. Идем разбираться - вижу, что она как раз примерно так и оптимизировала :)
...
Рейтинг: 0 / 0
07.10.2006, 15:53
    #34039506
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Aklinнасколько помню кроме бинарного дерева нет стабильных алгоритмов n*log(n)
а я тебе, помнится, рассказывал об одном таком. я же прошу отсортировать не абстрактное множество элементов а вполне ограниченное(!). Сначало сортируем по старнему разряду, потом по младшему.Тут и log не появляется даже. И придумал как под это дополнительную память не отхапывать. Сначало рассчитываем границы по старшим разрядам, потом расскидываем все элементы по группам а потом сортируем сами группы.
...
Рейтинг: 0 / 0
07.10.2006, 15:56
    #34039510
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
softwarer maytonДобавлю. Для массивов размером 2-3 элемента вполне подойтет метод "Пузыря". И нечего здесь стеснятся.
Тут нужна аккуратность. Помнится, на первом курсе параллельному потоку дали курсовую по методам сортировки, и я по этому поводу дал знакомой девчонке распечатку реализации qsort-а - ту, которая шла в демках к пятому паскалю. Вдруг она жалуется - мол, работает медленнее пузырька. Идем разбираться - вижу, что она как раз примерно так и оптимизировала :)
а вот простой вариант Qsorta своего сочинения:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void mqsort(int *l,int *r){
	if(l>=r)return;
	static int *i,*j;	
	static int t,swap;
	t=*l;i=l;j=r;
	while( 1 ){
	do i++; while(i<=r&&*i<t);
	do j--; while(*j>t);
	if(i>j)
		break;
	swap=*i;*i=*j;*j=swap;	
	}
	swap=*l;*l=*j;*j=swap;	
	mqsort(l,j);mqsort(j+ 1 ,r);
}
тут и ошибиться невозможно
...
Рейтинг: 0 / 0
07.10.2006, 16:04
    #34039516
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Den_di

Ну... это перевод фундаментального алгоритма. Я-то думал, что вы похвастаетесь гибридным. С подгруппами и т.п.
...
Рейтинг: 0 / 0
07.10.2006, 16:19
    #34039532
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
mayton Den_di

Ну... это перевод фундаментального алгоритма. Я-то думал, что вы похвастаетесь гибридным. С подгруппами и т.п.
так это не о том
Если гибридный, то что-то типа такого
Код: plaintext
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.
void mqsort(int *l,int *r){
	static int *i,*j;	
	static int t,swap;
	if(l>=r)
		return;
	if((r-l)< 20 ){
   	i=l;
   	for(;i<r;i++){
   		if((*i)<(*(i- 1 ))){
      		j=i;swap=*i;
      		while((swap<*(j- 1 ))&&(j>l)){*(j--)=*(j-1);}
      		*j=swap;
   		}		
   	}
   }
   else{
   	t=*l;i=l;j=r;
   	while( 1 ){
   	do i++; while(i<=r&&*i<t);
   	do j--; while(*j>t);
   	if(i>j)
   		break;
   	swap=*i;*i=*j;*j=swap;	
   	}
   	swap=*l;*l=*j;*j=swap;	
   	mqsort(l,j);mqsort(j+ 1 ,r);
   }
}

Только это не всегда лучьше предыдущего. Так как насчёт сортировки набольших массивов!
...
Рейтинг: 0 / 0
07.10.2006, 16:36
    #34039545
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
(смеясь)

Экой вы коллега ... настойчивый!

Ну.. для 100 элементов - теория умалчивает! И я вслед за ней скажу - не знаю!

В вашем исходнике есть несколько настроечных параметров .

1) Размер массива (расстояние между поинтерами L и R)
2) Порог переключения алгоритма (20)
3) Статистические особенности иходных данных (массив может быть заранее отсортирован, перемешан, перемешан с монотонными подпоследовательностями).

Подвигайте их. Понаблюдайте время отклика алгоритма. Табличку, что я нарисовал можете изменить как будет удобно.

Дополнительно, могу предложить использовать параллелизм. Если у вас Hyper-Threading или несколько CPU , можете залочить mqsort на два потока. Только помните, что beginthread() или fork() инерционны и требуют некоторого время для разгона.
...
Рейтинг: 0 / 0
07.10.2006, 18:21
    #34039677
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
mayton
(смеясь)

Да то что я там написал никокого отношения к эффективности не имеет!
Заниматься глупостями вроде Хоара тем более. Я же говорил, что он далеко не лидер по скорости. Например даже мой кривой алгоритм(нормальный немного сложнее, и быстрее в 2-3 раза) и то быстрее Qsorta в 2 раза: maytonНу.. если не затруднит. Был-бы признателен. Я говорил о чём-то вроде этого
Код: plaintext
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.
void msort(unsigned int *l,unsigned int n){
	
	unsigned int rdx[( 1 << 16 )+ 1 ];
	unsigned int ins[( 1 << 16 )+ 1 ];
	unsigned int i,t,s;
	
	for(i= 0 ;i<( 1 << 16 )+ 1 ;i++)rdx[i]= 0 ;
	for(i= 0 ;i<n;i++)rdx[(l[i]&0xffff)+ 1 ]++;
	for(i= 1 ;i<( 1 << 16 )+ 1 ;i++)ins[i]=rdx[i]+=rdx[i- 1 ];	
	
	for(i= 0 ;i<n;){
		t=l[i]&0xffff;
		if(rdx[t]>i){s=l[ins[t]];l[ins[t]++]=l[i];l[i]=s;}
		else{i++;}
	}
	
	for(i= 0 ;i<( 1 << 16 )+ 1 ;i++)rdx[i]= 0 ;
	for(i= 0 ;i<n;i++)rdx[(l[i]>> 16 )+ 1 ]++;
	for(i= 1 ;i<( 1 << 16 )+ 1 ;i++)ins[i]=rdx[i]+=rdx[i- 1 ];	
	
	for(i= 0 ;i<n;){
		t=l[i]>> 16 ;
		if(rdx[t]>i){s=l[ins[t]];l[ins[t]++]=l[i];l[i]=s;}
		else{i++;}
	}
}

алгоритм элементарный и почти не требует дополнительной памяти!. Я же спрашиваю именно про самую быструю сортировку небольших массивов!

Если кто знает алгоритм быстрее моего, прошу сказать, буду рад
...
Рейтинг: 0 / 0
09.10.2006, 15:55
    #34042071
aleks2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Нерекурсивный QSort. Для Intel-я call и стек - дорогое удовольствие.
...
Рейтинг: 0 / 0
09.10.2006, 22:58
    #34042989
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Den_di
...Если кто знает алгоритм быстрее моего, прошу сказать, буду рад


Я сравнивал ваш алгоритм с классическими (книжными) реализациями сортировок. Уже есть статистика. Но перед тем, как ее публиковать мне-бы хотелось бы задать вам несколько вопросов.

1) Вы действительно являетесь автором РЕАЛИЗАЦИИ этого алгоритма? Не является ли ваш алгоритм родственником метода Шелла?
2) Откуда произошла константа 0xffff ? На что влияет ее выбор ?
3) Этот алгоритм позиционируется как ДОПОЛНЕНИЕ к Хоару на малых размерах блока (менее 100 элементов ) ?

Условия тестирования:
Comp: Celeron 1700/256/2x512Mb
OS: CentOS(Linux), GnuC++
...
Рейтинг: 0 / 0
10.10.2006, 16:43
    #34044988
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
mayton Den_di
...Если кто знает алгоритм быстрее моего, прошу сказать, буду рад


Я сравнивал ваш алгоритм с классическими (книжными) реализациями сортировок. Уже есть статистика. Но перед тем, как ее публиковать мне-бы хотелось бы задать вам несколько вопросов.

1) Вы действительно являетесь автором РЕАЛИЗАЦИИ этого алгоритма? Не является ли ваш алгоритм родственником метода Шелла?
2) Откуда произошла константа 0xffff ? На что влияет ее выбор ?
3) Этот алгоритм позиционируется как ДОПОЛНЕНИЕ к Хоару на малых размерах блока (менее 100 элементов ) ?

Условия тестирования:
Comp: Celeron 1700/256/2x512Mb
OS: CentOS(Linux), GnuC++
Ну, если вы не поняли, что он вообще не сортирует, то жаль. Он почти сортирует. Это просто алгоритм деления не на 2 группы, а на N.
Выбор Oxffff произощёл от деления на 1<<16 групп.
Алгоритм вполне самостоятельный, но после него нужен проход чнм-то вроде шелла.
А вот это его полный вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
void msort(unsigned int *l,unsigned int n,unsigned int m){
	
	if(m==- 4 ||n< 2 )
		return;

	unsigned int rdx[( 1 << 4 )+ 1 ];
	unsigned int ins[( 1 << 4 )+ 1 ];
	unsigned int i,t,s;

	for(i= 0 ;i<( 1 << 4 )+ 1 ;i++)rdx[i]= 0 ;
	for(i= 0 ;i<n;i++)rdx[((l[i]>>m)&0xf)+ 1 ]++;
		for(i= 1 ;i<( 1 << 4 )+ 1 ;i++)ins[i]=rdx[i]+=rdx[i- 1 ];

	for(i= 0 ;i<n;){
		t=(l[i]>>m)&0xf;
		if(rdx[t]>i){s=l[ins[t]];l[ins[t]++]=l[i];l[i]=s;}
		else{i++;}
	}

	for(i= 0 ;i<( 1 << 4 );i++)
		msort(&l[rdx[i]],rdx[i+ 1 ]-rdx[i],m- 4 );
}
...
Рейтинг: 0 / 0
10.10.2006, 16:44
    #34044997
Den_di
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
да, вызывать как
msort(mas,N,28);
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
03.10.2012, 15:10
    #37982098
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
Den_di softwarerпропущено...

Тут нужна аккуратность. Помнится, на первом курсе параллельному потоку дали курсовую по методам сортировки, и я по этому поводу дал знакомой девчонке распечатку реализации qsort-а - ту, которая шла в демках к пятому паскалю. Вдруг она жалуется - мол, работает медленнее пузырька. Идем разбираться - вижу, что она как раз примерно так и оптимизировала :)
а вот простой вариант Qsorta своего сочинения:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
void mqsort(int *l,int *r){
	if(l>=r)return;
	static int *i,*j;	
	static int t,swap;
	t=*l;i=l;j=r;
	while(1){
	do i++; while(i<=r&&*i<t);
	do j--; while(*j>t);
	if(i>j)
		break;
	swap=*i;*i=*j;*j=swap;	
	}
	swap=*l;*l=*j;*j=swap;	
	mqsort(l,j);mqsort(j+1,r);
}


тут и ошибиться невозможно
как то страшно выставлять int *r за правый край массива для нормальной работы
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
int main(array<System::String ^> ^args)
{

  int ar[]={1,2};
  int x[]={1111,2222};
  int *l=ar;
                                                    cout<< (sizeof(ar)/sizeof(int));
  int *r=ar+(sizeof(ar)/sizeof(int));   
                                                    cout<<endl<< (int)l<<" "<<(int)r<< endl;
                                                     cout<<endl<< *l<<" "<<*r<< endl;

  mqsort(l,r);
  for (int i = 0; i < sizeof(ar)/sizeof(int); i++)
   cout<< ar[i]<<" ";
return 0;
}




mayton Den_di

Ну... это перевод фундаментального алгоритма. Я-то думал, что вы похвастаетесь гибридным. С подгруппами и т.п.
а перевод какого фундаментального?
а почему во всех, гм, некоторых, мной просмотренных версиях Хоара (и в этой тоже)
выполняется явно избыточный свап элемента массива с собой.
в исходной версии
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	if (i <= j){
      		temp = a[i];
		a[i] = a[j];
		a[j] = temp;
         	i++;
		j--;
	}


i бывает равно j, явно лишняя работа.
неужто никто не озадачился за 52 года после публикации алгоритма?
или я шото не то вижу, в связи с полной деградацией?
...
Рейтинг: 0 / 0
03.10.2012, 16:16
    #37982270
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
tchingiz, я честно говоря не знаю что это за исходник.
Очевидно что не мой. А откуда дровишки?
...
Рейтинг: 0 / 0
03.10.2012, 18:32
    #37982523
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
сортировка небольших массивов
0)
на курсах в компьютерной академии крок.
1)
я рылся у нас по другим темам, там была ссылка на сайт с различными методами, который рекомендовали к изучению.
сайт забыл. было меньше равно
2)
http://www.codelab.ru/source/32/

Код: plaintext
1.
2.
3.
4.
5.
 if (i <= j) {
temp = x[i]; x[i] = x[j]; x[j] = temp;
this->CountSwap();
i++; j--;
}



3)
в википедии на других языках тоже меньше равно.
http://ru.wikipedia.org/wiki/%C1%FB%F1%F2%F0%E0%FF_%F1%EE%F0%F2%E8%F0%EE%E2%EA%E0
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / сортировка небольших массивов / 25 сообщений из 32, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]