Sortowanie przez wybieranie: Różnice pomiędzy wersjami

Z Wikipedii, wolnej encyklopedii
[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
m drobne techniczne
Enedil (dyskusja | edycje)
m Link do artykułu o algorytmach sortujących prowadzi teraz do konkretnej sekcji.
Linia 17: Linia 17:
Gdy zamiast wartości minimalnej wybierana będzie maksymalna, wówczas tablica będzie posortowana od największego do najmniejszego elementu.
Gdy zamiast wartości minimalnej wybierana będzie maksymalna, wówczas tablica będzie posortowana od największego do najmniejszego elementu.


Algorytm jest [[sortowanie|niestabilny]].
Algorytm jest [[Sortowanie#Klasyfikacja|niestabilny]].
Przykładowa lista to: [2a,2b,1] → [1,2b,2a] (gdzie 2b=2a)
Przykładowa lista to: [2a,2b,1] → [1,2b,2a] (gdzie 2b=2a)



Wersja z 12:40, 30 maj 2014

{{{nazwa}}}
Ilustracja
Rodzaj

Sortowanie

Struktura danych

Tablica, lista

Złożoność
Czasowa

O(n2)

Sortowanie przez wybieranie - jedna z prostszych metod sortowania o złożoności O(n2). Polega na wyszukaniu elementu mającego się znaleźć na zadanej pozycji i zamianie miejscami z tym, który jest tam obecnie. Operacja jest wykonywana dla wszystkich indeksów sortowanej tablicy.

Algorytm przedstawia się następująco:

  1. wyszukaj minimalną wartość z tablicy spośród elementów od i+1 do końca tablicy
  2. zamień wartość minimalną, z elementem na pozycji i

Gdy zamiast wartości minimalnej wybierana będzie maksymalna, wówczas tablica będzie posortowana od największego do najmniejszego elementu.

Algorytm jest niestabilny. Przykładowa lista to: [2a,2b,1] → [1,2b,2a] (gdzie 2b=2a)

Przykład

Posortowana zostanie tablica 8-elementowa [9,1,6,8,4,3,2,0]. W tablicy pogrubione zostaną te elementy wśród których wyszukuje się wartość minimalną.

nr iteracji (wartość i) tablica minimum
0 [9,1,6,8,4,3,2,0] 0
1 [0,1,6,8,4,3,2,9] 1 (element znajduje się na właściwej pozycji)
2 [0,1,6,8,4,3,2,9] 2
3 [0,1,2,8,4,3,6,9] 3
4 [0,1,2,3,4,8,6,9] 4 (...)
5 [0,1,2,3,4,8,6,9] 6
6 [0,1,2,3,4,6,8,9] 8 (...)

Algorytm można nieco przyspieszyć, gdy tablica jest wypełniana z obu końców, tj. wyszukiwane jest równocześnie minimum i maksimum.

Implementacja

Sortowanie przez wybieranie w C++:

  • przez wyszukiwanie największego składnika:
 int Max_element_indeks(int n)
   {
     int max = 0;
     for (int i = 1; i < n; i++)
       if (t[i] > t[max])
         max = i;
     return max;
   }

  void Selection_sort(int n)
  {
    for (int i = n; i >= 2; i--)
    {
      int max = Max_element_indeks(i);
      if (max != i - 1)
        swap(t[i - 1], t[max]);
    }
  }
template<typename It>
void selection_sort(It begin, It end)
{
  for (; begin != end; ++begin)
    std::iter_swap(begin, std::min_element(begin, end));
}
  • przez wyszukiwanie najmniejszego składnika:
#include <cstdlib>
#include <iostream>

using namespace std;

void selection_sort(int n, int t[]);

int main(void)
{
   int tab[20];
   srand(time(NULL));
   for(int i=0; i<20; i++) {
      tab[i] = rand()%100;
      cout << tab[i] << " ";
   }
   cout << endl;
   selection_sort(20, tab);
   for(int i=0; i<20; i++) cout << tab[i] << " ";
   cout << endl;
   return 0;
}

void selection_sort(int n, int t[])
{
   int i, j, k;
   for(i=0; i<n; i++) {
      k=i;
      for(j=i+1; j<n; j++) if(t[j]<t[k]) k=j;
      swap(t[k], t[i]);
   }
}

Sortowanie przez wybieranie w ruby

#!/usr/bin/ruby

# sortowanie przez wybor 

def wsort(list)
	for i in 0...(list.size - 1)
		min = i
		for j in (i+1)...(list.size)
			if list[j] <= list[min]
				min = j
			end
		list[i], list[min] = list[min], list[i]
		end
	end
	return list
end

list = []
puts "podaj dane do posortowania CTRL-D - koniec"
while line = $stdin.gets
  list << line.to_i
end
puts "Dane posortowane"
puts wsort(list)

Sortowanie przez wybieranie w PHP

<?php
function selection_sort($tab)
{
	$n = count($tab);
	for($j=0; $j<$n-1; $j++)
	{
		$pmin = $j;
		for($i=$j+1; $i<$n; $i++)
		{
			if($tab[$i] < $tab[$pmin])
			{
				$pmin = $i;
			}
		}
		$x = $tab[$pmin];
		$tab[$pmin] = $tab[$j];
		$tab[$j] = $x;
	}	
	return $tab;
}

// generujemy tablicę 30 liczb do posortowania
$arr = array();
for($i=1; $i<=30; $i++)
{
	$arr[] = rand(10,99); // zapełniamy tablicę liczbami dwucyfrowymi
}

// drukujemy wygenerowaną tablicę
echo "Przed sortowaniem: <br />";
foreach($arr as $k)
{
	echo $k. " ";
}

// drukujemy posortowaną tablicę
echo "<br /><br />Po sortowaniu: <br />";
$sort = selection_sort($arr);
foreach($sort as $k)
{
	echo $k. " ";
}
?>

Linki zewnętrzne