La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…),

Presentazioni simili


Presentazione sul tema: "Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…),"— Transcript della presentazione:

1 Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…), (SPLIT) 2. Ordina le due liste separatamente (MERGESORT) 3. Fondi le due liste ottenute (ordinate) in una unica lista ordinata (MERGE)

2 MERGE (di due liste ordinate L 1,L 2 M) Algoritmo dipende dalla rappresentazione delle liste Usiamo LISTE A PUNTATORI: ogni elemento della lista è una struttura typedef struct CELL *LIST struct CELL{ int element /* elemento della lista*/ LIST next /* puntatore alla successiva struttura (elemento)*/ } (a 1,a 2,…,a n ) a 1 a 2 … a n

3 MERGE (di due liste ordinate L 1,L 2 M) -Trova il minimo tra il primo elemento di L1 e di L2, rimuovilo dalla lista di appartenenza ed aggiungilo ad M. - Ripeti -LIST merge ( LIST list1, LIST list2) { if (list1== NULL ) return list2 else if ( list2== NULL) return list1 else if (list1->element element) /* entrambe le liste non vuote ed il primo elemento di list1 è minore del primo di list2*/ { list1->next=merge(list1->next, list2); return list1; } else /*entrambe le liste non vuote ed il primo elemento di list2 è minore del primo di list1*/ { list2->next=merge(list1, list2->next); return list2; }

4 MERGE (di due liste ordinate L 1,L 2 M) -Trova il minimo tra il primo elemento di L1 e di L2, rimuovilo dalla lista di appartenenza ed aggiungilo ad M. - Ripeti -LIST merge ( LIST list1, LIST list2) { if (list1== NULL ) return list2 else if ( list2== NULL) return list1 else if (list1->element element) /* entrambe le liste non vuote ed il primo elemento di list1 è minore del primo di list2*/ { list1->next=merge(list1->next, list2); return list1; } else /*entrambe le liste non vuote ed il primo elemento di list2 è minore del primo di list1*/ { list2->next=merge(list1, list2->next); return list2; }

5 MERGE (di due liste ordinate L 1,L 2 M) -Trova il minimo tra il primo elemento di L1 e di L2, rimuovilo dalla lista di appartenenza ed aggiungilo ad M. - Ripeti -LIST merge ( LIST list1, LIST list2) { if (list1== NULL ) return list2 else if ( list2== NULL) return list1 else /* entrambe le liste non vuote*/ if (list1->element element) /* entrambe le liste non vuote ed il primo elemento di list1 è minore del primo di list2*/ { list1->next=merge(list1->next, list2); return list1; } else /*entrambe le liste non vuote ed il primo elemento di list2 è minore del primo di list1*/ { list2->next=merge(list1, list2->next); return list2; }

6 MERGE (di due liste ordinate L 1,L 2 M) LIST merge (LIST list1, LIST list2) { if (list1==NULL) return list2 else if ( list2== NULL) return list1 else if ( list1->element element ) {/* entrambe le liste non vuote ed il primo elemento di list1 è minore del primo di list2*/ list1->next=merge(list1->next, list2); return list1;} else …} list1 a 1 a 2 … a n list2 b 1 b 2 … b n a 2 … a n list1 a 1 merge b 1 … b n

7 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 list1=merge(list1, list2) merge (2-4-7, 3-5-6-9)

8 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 Merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2) merge(4-7,3-5-6-9)

9 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 Merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2) merge(4-7,3-5-6-9) = merge(, ) merge(4-7, 5-6-9)

10 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 Merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2) merge(4-7,3-5-6-9) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9)

11 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 Merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2) merge(4-7,3-5-6-9) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9) = merge(, ) merge(7, 6-9)

12 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 Merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2) merge(4-7,3-5-6-9) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9) = merge(, ) merge(7, 6-9) = merge(, ) merge(7, 9)

13 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 Merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2) merge(4-7,3-5-6-9) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9) = merge(, ) merge(7, 6-9) = merge(, ) merge(7, 9) = merge(NULL, )= merge(, 9) 9

14 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 Merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2) merge(4-7,3-5-6-9) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9) = merge(, ) merge(7, 6-9) = merge(, ) = merge(7, 9) 7

15 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 Merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2) merge(4-7,3-5-6-9) = merge(, ) merge(4-7, 5-6-9) = merge(, ) merge(7, 5-6-9) = merge(, )= merge(7, 6-9) 6

16 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 Merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2) merge(4-7,3-5-6-9) = merge(, ) merge(4-7, 5-6-9) = merge(, ) = merge(7, 5-6-9) 5

17 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 Merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2) merge(4-7,3-5-6-9) = merge(, ) = merge(4-7, 5-6-9) 4

18 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 list1=merge(list1, list2) merge (2-4-7, 3-5-6-9) merge( list2)=list2 merge(4-7,3-5-6-9) list2 3

19 MERGE (di due liste ordinate L 1,L 2 M) list1 2 4 7 list2 3 5 6 9 list1=merge(list1, list2) merge (2-4-7, 3-5-6-9) list1 2

20 SPLIT (di L in due liste ordinate L 1,L 2 ) LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell; } L=(a 1,a 2, a 3, a 4, …, a n ) L 1 =(a 1, a 3, …), L 2 =(a 2, a 4, …)

21 SPLIT (di L in due liste ordinate L1,L2) LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell;}} list a 1 a 2 a 3 … a n

22 SPLIT (di L in due liste ordinate L1,L2) LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell;}} list a 1 a 2 a 3 … a n pSecondcell

23 SPLIT (di L in due liste ordinate L1,L2) LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell;}} list a 1 a 2 a 3 … a n pSecondcell

24 SPLIT (di L in due liste ordinate L1,L2) LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell;}} list a 1 a 2 a 3 … a n Split di pSecondcell

25 MERGESORT BASE: Se la lista contiene 0 o 1 elemento, stop Ind.: Split di (a 1,a 2, …) in (a 1,a 3,…) e (a 2,a 4,…) Mergesort delle due liste separatamente Merge delle 2 liste ordinate

26 MERGESORT LIST Mergesort (LIST list) { List SecondList; if (list==NULL) return NULL else if (list->next==NULL) return list else {/* list contiene almeno 2 elementi (da ordinare)*/ SecondList=split(list); return merge(mergesort(list),mergesort(ScondList)); } BASE: Se la lista contiene 0 o 1 elemento, stop Ind.: Split di (a 1,a 2, …) in (a 1,a 3,…) e (a 2,a 4,…) Mergesort delle due liste separatamente Merge delle 2 liste ordinate

27 R.T. della funzione SPLIT LIST Split (LIST list) { List pSecondcell; if (list==NULL) return NULL else if (list->Next==NULL) return NULL else {/* list contiene almeno 2 elementi*/ pScondcell=list->next; list->next = pSecondcell->next; pSecondcell->next=split(pSecondcell->next); return pSecondcell;}} Sia n=|list|. Si ha la relazione di ricorrenza T(0)=T(1)=O(1) T(n)=c+T(n-2), per n>1 Quindi T(n)=O(n)

28 R.T. del MERGE LIST merge ( LIST list1, LIST list2) { if (list1== NULL ) return list2 else if ( list2== NULL) return list1 else if (list1->element element) { list1->next=merge(list1->next, list2); return list1; } else { list2->next=merge(list1, list2->next); return list2;} } Siano n1=|list1|, n2=|list2|, n=n1+n2. Si ha la relazione di ricorrenza T(0)=T(1)=O(1) (almeno 1 lista vuota) T(n)=c+T(n-1), per n>1 Quindi T(n)=O(n)

29 R.T. MERGESORT LIST Mergesort (LIST list) {List SecondList; if (list==NULL) return NULL else if (list->next==NULL) return list else /* list contiene almeno 2 elementi (da ordinare)*/ {SecondList=split(list); return merge(mergesort(list),mergesort(ScondList));} } Sia n=|list|. Si ha la relazione di ricorrenza T(0)=T(1)=O(1) (list contiene 0 o 1 elemento) T(n)=O(n) + O(n) +T(n/2) +T(n/2) =O(n) + 2 T(n/2), per n>1 Quindi T(n)=O(n log n)

30 R.T. MERGESORT T(0)=T(1)=O(1) T(n)=c n + 2 T(n/2), per n>1 Si assuma per semplicità che n=2 m (cioè m=log n) T(2 m )=c 2 m + 2 T(2 m-1 ) =c 2 m + 2 (c 2 m-1 + 2 T(2 m-2 ))= c 2 m + c 2 m +4 T(2 m-2 ) = 2c 2 m + 4 T(2 m-2 ) = 2c 2 m +4 (c 2 m-2 + 2 T(2 m-3 ))=2c 2 m + c 2 m +8T(2 m-3 ) = 3c 2 m + 8 T(2 m-3 ) …… = i c 2 m + 2 i T(2 m-i ) Scegliendo i=m=log n si ha T(n)= T(2 m ) = m c 2 m + 2 m T(2 0 )= m c n + n a= = c n log n + a n = O(n log n)

31 Correttezza MERGESORT LIST Mergesort (LIST list) {List SecondList; if (list==NULL) return NULL else if (list->next==NULL) return list else /* list contiene almeno 2 elementi (da ordinare)*/ {SecondList=split(list); return merge(mergesort(list),mergesort(ScondList));} } Assumiamo correttezza delle funz.split e merge (esercizio) Per induzione completa su n=|list|. Base. Se n=0 o n=1, restituisce lista inalterata, ok. Passo (n>1). Assumiamo per i.i. mergesort(list), mergesort(ScondList) restituiscono liste input ordinate. Quindi Split divide gli elementi lista input con n elementi tra list e Secondlist; mergesort(list),mergesort(ScondList) ordina le liste; Merge fonde le liste restituendo in output una lista ordinata contenete gli stessi n elementi della lista input.

32


Scaricare ppt "Sorting: MERGESORT Vogliamo ordinare lista (a 1,…,a n ). 1.Dividi lista in 2 sottoliste aventi (quasi) la stessa dimensione: (a 1,a 3,a 5,…) e (a 2,a 4,…),"

Presentazioni simili


Annunci Google