Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Stabil Quicksort?!

Postades av 2006-08-07 23:11:12 - Magnus Sedlacek, i forum c++, Tråden har 6 Kommentarer och lästs av 1293 personer

Hej

ett litet problem, hur gör man quicksort stabil, har hämtat följande kod ur Sedgewick (se nedan).
Funktionen quicksort är stabil men inte partition. DVS hur gör man partition stabil?

Eller måste man gör på något annat sätt?

template <class Type>
void Algorithms<Type>::QuickSort(vector<Type> &a, int l, int r)
{
if (r <= l) return;
int i = partition(a, l, r);
QuickSort(a, l, i-1);
QuickSort(a, i+1, r);
}

template <class Type>
int Algorithms<Type>::partition(vector<Type> &a, int l, int r)
{
int i = l-1, j = r;
Type v = a[r];
for (;;) {
while (a[++i] < v) ;
while (v < a[--j]) if (j == l)
break;
if (i >= j) break;
exch(a[i], a[j]);
}
exch(a[i], a[r]);
return i;
}


Svara

Sv: Stabil Quicksort?!

Postades av 2006-08-08 08:43:53 - Martin Adrian

Har för mig att man kopierar till en temporär buffer som man sen lägger till på slutet

Nåt i stil med:

<code=c++>
template <typename It>
void stable_partition(It first, It last, const It::value_type& key) {
vector<It::value_type> buf;
It next = first;
for (; first != last; ++first) {
if (*first < key)
*next++ = *first;
else
buf.push_back(*first);
}
std::copy(buf.begin(), buf.end(), next);
}
</code>


Svara

Sv:Stabil Quicksort?!

Postades av 2006-08-08 09:58:17 - Niklas Jansson

Är det inte generellt så att den då blir (iofs konstant, men ändå) typ hälften så snabb?

Det finns ett annat sätt att stabilisera alla sorteringsalgoritmer som av någon anledning mycket sällan lärs ut. Jag har "hittat på det" själv, men det kan knappast vara en speciellt unik idé. Det är extremt enkelt:

Vi har en sekvens a, med n(a) element. Vi skapar nu ytterligare en sekvens b av samma typ (lista, vektor, whatever), och samma längd, men med int-element istället. Vi fyller denna sekventiellt med intar från 1 till n(a).

Sen hanterar vi antingen detta som en sekvens med par eller ett par med sekvenser.

(Enklare uttryckt av allt där uppe, vi slänger på en 1:a på första elementet, en 2:a på andra elementet, osv.)

Sen kör vi en godtycklig sorteringsalgoritm. Sorteringsalgoritmen använder (om det är en comparison sort) någonstans en funktion "compare". Låt säga:

for (p = begin(); p != end(); p++)
if(compare(p, q) > 0)
p>q
else if(compare(p, q) < 0)
p<q
else
p==q

Vad vi helt enkelt gör nu är att "augmenta" compare med ytterligare en punkt, typ:

int compare_aux(a, b)
{
if(compare(a, b)==0)
return b.tag-a.tag;
else
return compare(a,b);
}

Så kommer man alltid få distinkta element, och de kommer alltid ligga rätt.


Svara

Sv: Stabil Quicksort?!

Postades av 2006-08-08 12:58:27 - Niklas Jansson

Eller kanske enklare beskrivning av modifikationen:

template<T>
bool operator<(T lhs, T rhs){
if (lhs == rhs)
return lhs.tag < rhs.tag;
return lhs < rhs;
}


Svara

Sv:Stabil Quicksort?!

Postades av 2006-08-08 18:43:30 - Magnus Sedlacek

Hej å tack för svaren.

Förstår inte riktigt hur och var jag ska implementera jämförelsen.

lhs.tag? antar att man gör om sin array, vector till en vector bestående av struct med int tag och data?!


Svara

Sv: Stabil Quicksort?!

Postades av 2006-08-09 09:51:42 - Niklas Jansson

Ja precis. Mina uttryck var lite pseudokodsaktiga...
Om vi säger så här då, du börjar med:

a b c d e a a d

Du utökar detta till:

(a 1) (b 2) (c 3) (d 4) (e 5) (a 6) (a 7) (d 8)

Sen sorterar du i första hand på bokstav, och i andra hand på din tag. I princip betyder det bara att om bokstäverna är samma så sorterar du på tag.

Detta ger i så fall

(a 1) (a 6) (a 7) (b 2) (c 3) (d 4) (d 8) (e 5)


För att sortera vill man ha något sätt att jämföra två objekt, eller hur?
Det man normalt sätt använder är < osv.
Så säg att du har en klass som har < och == definierad:

class A{
public:
  operator<(A a) {...}
  operator==(A a) {...}
//...
}

//Då skapar du en ny klass
class B{
public:
  operator<(B b) {
    if(b.a == a)
      return (b.tag < tag);
    else
      return b.a<a;
  }
  operator==(B b) {return false;}
//...
private:
  A a;
}

//du har från början
vector<A> va = ...;

//och sen använder du dig av:
vector<B> vb = make_vec_b(va);
QuickSort(vb);

va = make_vec_a(vb);


Typ.


Svara

Sv:Stabil Quicksort?!

Postades av 2006-08-09 21:55:33 - Magnus Sedlacek

Tackar!


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
149
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies