Примеры реализации сортировки перемешиванием
Материал из Викиучебника
Содержание |
[править] Pascal
k:= 25; {Индекс последнего изменения} s:= 1; {Первый элемент массива} e:= 25; {Последний элемент массива} while e > s do begin for i:= e downto s+1 do if Arr[i] < Arr[i-1] then begin tmp := Arr[i]; Arr[i] := Arr[i-1]; Arr[i-1] := tmp; k := i; end; s:=k; for i:= s to e-1 do if Arr[i]>Arr[i+1] then begin tmp := Arr[i]; Arr[i] := Arr[i+1]; Arr[i+1] := tmp; k := i; end; e:=k; end;
Для варианта С++ и С пример не совсем соответствуют.
[править] C++
#include <algorithm> template< typename Iterator > void cocktail_sort( Iterator first, Iterator last ) { for( --last; first < last; --last, ++first ) { for( Iterator i = first; i < last; ++i ) if ( *(i + 1) < *i ) std::iter_swap( i, i + 1 ); for( Iterator i = last - 1; i > first; --i ) if ( *i < *(i - 1) ) std::iter_swap( i, i - 1 ); } }
[править] C
#define SWAP(A,B) {A=A^B; B=A^B; A=A^B;} void m_sheker(int mas[], int n) { int last = n-1, left = 1, right = n-1, j; do { for(j = right; j >= left; j--) { if(mas[j-1] > mas[j]) { SWAP(mas[j-1], mas[j]); last = j; } } left = last + 1; for(j = left; j <= right; j++) { if(mas[j-1] > mas[j]) { SWAP(mas[j-1], mas[j]); last = j; } } right = last-1; } while(left < right); }
[править] C#
public static void ArrSort(int[] name) { int b = 0; int left = 0;//Левая граница int right = name.Length - 1;//Правая граница while(left<right) { for (int i = left; i < right; i++)//Слева направо... { if (name[i] > name[i + 1]) { b = name[i]; name[i] = name[i + 1]; name[i + 1] = b; b= i; } } right = b;//Сохраним последнюю перестановку как границу if (left >= right) break;//Если границы сошлись выходим for (int i = right; i > left; i--)//Справа налево... { if (name[i-1] > name[i]) { b = name[i]; name[i] = name[i-1]; name[i -1] = b; b = i; } } left = b;//Сохраним последнюю перестановку как границу } }