abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 17:44 | Zajímavý článek

    Devadesátková hra Brány Skeldalu prošla portací a je dostupná na platformě Steam. Vyšel i parádní blog autora o portaci na moderní systémy a platformy včetně Linuxu.

    karkar | Komentářů: 0
    dnes 12:11 | Humor

    Lidi dělají divné věci. Například spouští Linux v Excelu. Využít je emulátor RISC-V mini-rv32ima sestavený jako knihovna DLL, která je volaná z makra VBA (Visual Basic for Applications).

    Ladislav Hagara | Komentářů: 1
    dnes 10:44 | IT novinky

    Revolut nabídne neomezený mobilní tarif za 12,50 eur (312 Kč). Aktuálně startuje ve Velké Británii a Německu.

    Ladislav Hagara | Komentářů: 21
    dnes 09:55 | IT novinky

    Společnost Amazon miliardáře Jeffa Bezose vypustila na oběžnou dráhu první várku družic svého projektu Kuiper, který má z vesmíru poskytovat vysokorychlostní internetové připojení po celém světě a snažit se konkurovat nyní dominantnímu Starlinku nejbohatšího muže planety Elona Muska.

    Ladislav Hagara | Komentářů: 0
    dnes 09:33 | IT novinky

    Poslední aktualizací začal model GPT-4o uživatelům příliš podlézat. OpenAI jej tak vrátila k předchozí verzi.

    Ladislav Hagara | Komentářů: 0
    dnes 08:11 | Nová verze

    Google Chrome 136 byl prohlášen za stabilní. Nejnovější stabilní verze 136.0.7103.59 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Opraveno bylo 8 bezpečnostních chyb. Vylepšeny byly také nástroje pro vývojáře.

    Ladislav Hagara | Komentářů: 0
    včera 20:55 | Nová verze

    Homebrew (Wikipedie), správce balíčků pro macOS a od verze 2.0.0 také pro Linux, byl vydán ve verzi 4.5.0. Na stránce Homebrew Formulae lze procházet seznamem balíčků. K dispozici jsou také různé statistiky.

    Ladislav Hagara | Komentářů: 0
    včera 16:22 | Nová verze

    Byl vydán Mozilla Firefox 138.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 138 je již k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    včera 15:55 | Pozvánky

    Šestnáctý ročník ne-konference jOpenSpace se koná 3. – 5. října 2025 v Hotelu Antoň v Telči. Pro účast je potřeba vyplnit registrační formulář. Ne-konference neznamená, že se organizátorům nechce připravovat program, ale naopak dává prostor všem pozvaným, aby si program sami složili z toho nejzajímavějšího, čím se v poslední době zabývají nebo co je oslovilo. Obsah, který vytvářejí všichni účastníci, se skládá z desetiminutových

    … více »
    Zdenek H. | Komentářů: 2
    včera 15:44 | IT novinky Ladislav Hagara | Komentářů: 4
    Jaký filesystém primárně používáte?
     (58%)
     (1%)
     (9%)
     (22%)
     (4%)
     (1%)
     (2%)
     (0%)
     (1%)
     (3%)
    Celkem 490 hlasů
     Komentářů: 19, poslední dnes 11:32
    Rozcestník

    Insertion a selection sort (seznam)

    7.5.2017 14:16 | Přečteno: 1091× | 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.