11a. Selection sort

2021-03-14
slides.com/jod/pt_11a

Docent: Jo Devriendt

Assistent: Ann Philips

Coördinator: Joost Vennekens

voornaam.achternaam@kuleuven.be

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Sorteeralgoritmes

Input: sequentie sorteerbare elementen

  • Bvb. [5,3,1,7,2,6,4,5]

Output: gesorteerde sequentie

  • [1,2,3,4,5,5,6,7]
  • In deze presentaties: array van gehele getallen sorteren van klein naar groot
  • a[i..j] geeft subarray van index i tot en met j-1 aan

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Sorteeralgoritmes

Overzicht:

  • Hst 11.2: selection sort (11a)
  • Hst 11.3: insertion sort (slaan we over)
    • uitstekende oefening om zelf te implementeren
  • Hst 11.4: quicksort (11b)
  • niet in cursus: merge sort (11c)
  • nog veel meer (slaan we ook over ;)

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Selection sort

  • Selecteer het kleinste element in de array
  • Wissel met het element vooraan
  • Herhaal met de rest van de array
  • Simpel!

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Selection sort

void swap(int* x, int* y){
  int tmp = *x;
  *x = *y;
  *y = tmp;
}

void selection(int a[], int n) {
  for (int i = 0; i < n - 1; ++i) {
    for (int j = i + 1; j < n; ++j) {
      if (a[j] < a[i]) {
        swap(&a[i],&a[j]);
      }
    }
  }
}

Vind kleinste element in a[i..n], stockeer in a[i]

Herhaal voor steeds kleinere restarrays

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Selection sort

#define N 8

int main() {
  int a[N] = {5,3,1,7,2,6,4,5};
  selection(a, N);
  for (int i = 0; i < N; ++i) {
    printf("%d ", a[i]);
  }
  printf("\n");
}
$ ./a.out
1 2 3 4 5 5 6 7

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Snelheidsanalyse

void swap(int* x, int* y){
  int tmp = *x;
  *x = *y;
  *y = tmp;
}

void selection(int a[], int n) {
  for (int i = 0; i < n - 1; ++i){
    for (int j = i+1; j < n; ++j){
      if (a[j] < a[i]) {
        swap(&a[i],&a[j]);
      }
    }
  }
}

Aantal keren door de binnenste for-loop:

n-1 + n-2 + \ldots + 2 + 1 \\ = (n-1)(n-2)/2 \\ = n^2/2-3n/2+1 \\ = O(n^2)

Dat kan beter :)

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Samenvatting

  • Sorteeralgoritmes ordenen een sequentie van sorteerbare elementen
  • Selection sort is simpel, maar doet er O(n^2) stappen over

11a. Selection sort

By Jo Devriendt

11a. Selection sort

  • 683