abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 16:22 | Upozornění

    Společnosti Ticketmaster byla odcizena databáze s osobními údaji (jméno, adresa, telefonní číslo a část platebních údajů) 560 miliónů zákazníku. Za odcizením stojí skupina ShinyHunters a za nezveřejnění této databáze požaduje 500 tisíc dolarů [BBC].

    Ladislav Hagara | Komentářů: 1
    31.5. 23:55 | Nová verze

    Byla vydána nová stabilní verze 24.05 linuxové distribuce NixOS (Wikipedie). Její kódové označení je Uakari. Podrobný přehled novinek v poznámkách k vydání. O balíčky se v NixOS stará správce balíčků Nix.

    Ladislav Hagara | Komentářů: 0
    31.5. 17:33 | Nová verze

    Byla vydána nová verze 1.48.0 sady nástrojů pro správu síťových připojení NetworkManager. Novinkám se v příspěvku na blogu NetworkManageru věnuje Fernando F. Mancera. Mimo jiné se v nastavení místo mac-address-blacklist nově používá mac-address-denylist.

    Ladislav Hagara | Komentářů: 27
    31.5. 17:11 | Komunita

    Před 25 lety, 31. května 1999, započal vývoj grafického editoru Krita (Wikipedie). Tenkrát ještě pod názvem KImageShop a později pod názvem Krayon.

    Ladislav Hagara | Komentářů: 4
    31.5. 12:55 | Nová verze

    Farid Abdelnour se v příspěvku na blogu rozepsal o novinkám v nejnovější verzi 24.05.0 editoru videa Kdenlive (Wikipedie). Ke stažení brzy také na Flathubu.

    Ladislav Hagara | Komentářů: 0
    31.5. 11:22 | Zajímavý článek

    David Revoy, autor mj. komiksu Pepper&Carrot, se rozepsal o své aktuální grafické pracovní stanici: Debian 12 Bookworm, okenní systém X11, KDE Plasma 5.27, …

    Ladislav Hagara | Komentářů: 9
    30.5. 22:44 | Nová verze

    Wayland (Wikipedie) byl vydán ve verzi 1.23.0. Z novinek lze vypíchnout podporu OpenBSD.

    Ladislav Hagara | Komentářů: 0
    30.5. 21:22 | Zajímavý článek

    Craig Loewen na blogu Microsoftu představil novinky ve Windows Subsystému pro Linux (WSL). Vypíchnout lze GUI aplikaci pro nastavování WSL nebo správu WSL z Dev Home.

    Ladislav Hagara | Komentářů: 0
    30.5. 12:44 | Pozvánky

    V sobotu 1. června lze navštívit Maker Faire Ostrava, festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí.

    Ladislav Hagara | Komentářů: 0
    30.5. 12:22 | Nová verze

    Webový server Caddy (Wikipedie) s celou řadou zajímavých vlastností byl vydán ve verzi 2.8 (𝕏). Přehled novinek na GitHubu.

    Ladislav Hagara | Komentářů: 17
    Rozcestník

    Insertion a selection sort (seznam)

    7.5.2017 14:16 | Přečteno: 1071× | Ostatní | poslední úprava: 7.5.2017 14:14

    Srovnání prvků v jednosměrném spojovém seznamu.

    Insertion sort - nový seznam nezačíná z ukazatele na strukturu, ale z adresy lokální struktury (dummy head). Pokud je prvek ze starého seznamu menší než poslední prvek z nového seznamu, je připojen před poslední prvek z nového seznamu, jinak je připojen jako poslední. Funkce vrací ukazatel na strukturu newl->next, který ukazuje na začátek nového seznamu.
    typedef struct elem {
    	char name[MAX];	
    	struct elem *next;
    } ELEM;
    
    ELEM *insertionsort(ELEM *oldl)
    {
    	struct elem head;
    	
    	ELEM *newl, *n, *t, *u;
    	
    	newl = &head; 
    	newl->next = NULL;
    	
    	if (oldl == NULL)
    		return NULL;	
    	
    	for (t = oldl; t != NULL; t = u) {
    		u = t->next;
    		for (n = newl; n->next != NULL; n = n->next)			
    			if (strcmp(n->next->name, t->name) > 0) 
    				break;
    		t->next = n->next;
    		n->next = t;
    	}
    	
    	return newl->next;
    }
    
    Selection sort - hledá se uzel, jehož ukazatel next ukazuje na největší prvek. Největší prvek je vypuštěn (prev->next = t->next) a následně připojen na začátek nového seznamu. Pokud je ve starém seznamu největší prvek na začátku, je přesunut na konec, přičemž je třeba posunout začátek. Funkce vrací adresu starého seznamu.
    typedef struct e {
    	int x;	
    	struct e *next;
    } E;
    
    E *selectionsort(E *oldl)
    {
    	E *newl, *prev, *p, *t;
    	
    	newl = NULL;	
    	
    	if (oldl == NULL)
    		return NULL;
    	
    	while (oldl->next != NULL) {
    	
    		t = p = prev = oldl;
    	
    		for (; p->next != NULL; p = p->next)			 
    			if (p->next->x > prev->next->x)				
    				prev = p;		
    		
    		if (t->x > prev->next->x) {		
    			oldl = oldl->next;	
    			prev = p;
    			p->next = t;		
    			t->next = NULL;		
    		}
    				
    		t = prev->next;
    		prev->next = t->next;
    		t->next = newl;
    		newl = t;			
    	}
    	
    	oldl->next = newl;		
    	
    	return oldl;
    }
    
    Z hlediska rychlosti jsou obě funkce vhodné maximálně pro deset tisíc prvků.

    Základ funkcí jsem převzal z knihy Algorithms in C od Roberta Sedgewicka.        

    Hodnocení: 33 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    7.5.2017 14:42 Radovan
    Rozbalit Rozbalit vše Re: Insertion a selection sort (seznam)
    typedef struct elem {
    	char name[MAX];	
    	struct elem *next1;
    	struct elem *next2;
            ... 
    } ELEM;
    
    ?
    7.5.2017 15:21 sad
    Rozbalit Rozbalit vše Re: Insertion a selection sort (seznam)
    Jestli je to narážka na jiný způsob, tak ten neznám.
    8.5.2017 02:28 Jardík
    Rozbalit Rozbalit vše Re: Insertion a selection sort (seznam)
    Když někde vidím konstantu MAX, tuším, že je to nějaká spatlanina, co má umělá omezení. Jinak pole by vyšlo určitě lépe, než linked list, hlavně kvůli cache.
    8.5.2017 04:33 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
    Rozbalit Rozbalit vše Re: Insertion a selection sort (seznam)
    Jo struktura co má sama sebe v sobě a ještě je z ní typedef je zajímavá :-D. Předpokládám že kompilátoru to pak nevadí že je definováno struct elem a používáno ELEM. Já bych se asi na to ELEM vykašlal je to jen o ušetření 7 bajtů.

    Případné další syntaktické odchylky nejsem schopnej posoudit (aneb pokud to projde checkpatchem a lkml tak pohoda :-D).
    8.5.2017 08:49 sad
    Rozbalit Rozbalit vše Re: Insertion a selection sort (seznam)
    Jo tak v tomhle vidíte problém. A já myslel, že je to narážka na nějaký lepší způsob řazení.

    typedef používám, protože nechci pořád psát struct v hlavičkách funkcí a tenhle zápis mi přijde docela elegantní, i když tohle je asi čistější:
    struct elem {
    	char name[MAX];	
    	struct elem *next;
    };
    
    typedef struct elem ELEM;
    
    Ve velkých projektech je asi lepší typedef nepoužívat (jak radí Linus), ale já jsem si zkoušel naprogramovat jen takovou kravinku.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.