Сортировка связного списка

Сортировка связного списка. Подавляющее большинство алгоритмов сортировки требует для своей работы возможности обращения к элементам сортируемого списка по их порядковым номерам (индексам). В связных списках, где элементы хранятся неупорядоченно, обращение к элементу по его номеру — довольно ресурсоёмкая операция, требующая в среднем сравнений и обращений к памяти. В результате применение типичных алгоритмов сортировки становится крайне неэффективным. Однако у связных списков есть преимущество: возможность объединить два отсортированных списка в один за время без использования дополнительной памяти.

Объединение двух упорядоченных списков

Пусть у нас есть односвязный список, элементы которого описаны структурой (пример на языке Pascal):

  type
    PList_Item = ^TList_Item;
    TList_Item = record
      Key: Integer;
      Next: PList_Item;
    end;
  var
    List: PList_Item; // Указатель на список

Алгоритм достаточно прост: на входе имеются указатели на первые элементы объединяемых списков. Началом результирующего списка из них выбирается элемент с наименьшим ключом. Затем в качестве следующих элементов результирующего списка выбирается последующие элементы из первого или второго исходного списка, с меньшим значением ключа. Когда достигнут последний элемент одного из исходных списков, указатель последнего элемента результирующего списка устанавливается на остаток другого входного списка.

  function IntersectSorted(const pList1, pList2: PList_Item): PList_Item;
  var
    pCurItem: PList_Item;
    p1, p2: PList_Item;
  begin
    p1 := pList1;
    p2 := pList2;
    if p1^.Key <= p2^.Key then 
    begin
      pCurItem := p1;
      p1 := p1^.Next;
    end 
    else begin
      pCurItem := p2;
      p2 := p2^.Next;
    end;
    Result := pCurItem;
    while (p1 <> nil) and (p2 <> nil) do
    begin
      if p1^.Key <= p2^.Key then
      begin
        pCurItem^.Next := p1;
        pCurItem := p1;
        p1 := p1^.Next;
      end 
      else begin
        pCurItem^.Next := p2;
        pCurItem := p2;
        p2 := p2^.Next;
      end;
    end;
    if p1 <> nil then
      pCurItem^.Next := p1
    else
      pCurItem^.Next := p2;
  end;

Сортировка односвязного списка

Процесс сортировки списка представляет собой последовательный проход по списку с сортировкой сначала пар элементов, затем каждой двойки пар элементов, с объединением в списки из 4х элементов, затем объединяются получившиеся списки из 8, 16 и т. д. элементов.

В предложенной реализации используется стек списков. Необходимый размер стека равен [log2n] + 1, где n — количество элементов списка. Если количество элементов заранее не известно, то можно заранее заложить достаточную глубину стека. Так, например, стек глубиной в 32 элемента может быть использован для сортировки списков длиной до 4294 967 295 элементов. В стеке сохраняются указатели на отсортированные части списка и уровень — число фактически равное log2i + 1, где i — количество элементов в этой части списка.

Суть алгоритма в следующем: идёт последовательный обход списка, при этом каждый элемент преобразуется к вырожденному списку, путём удаления указателя на следующий элемент. Указатель на созданный таким образом список помещается в стек, при этом уровень указывается равным 1, после чего проводится проверка: если два последних элемента стека имеют одно и то же значение уровня, то они извлекаются из стека, производится объединение списков, на которые указывают эти элементы, а результирующий список помещается в стек с уровнем на единицу больше предыдущего. Такое объединение повторяется пока уровни двух последних элементов равны, или пока не будет достигнута вершина стека. После того как исходный список полностью пройден, перечисленные в стеке списки объединяются вне зависимости от их уровня. Получившийся в результате объединения список и есть искомый, с отсортированными элементами

type
  TSortStackItem = record
    Level: Integer;
    Item: PList_Item;
  end;
var
  Stack: Array[0..31] of TSortStackItem;
  StackPos: Integer;
  p: PList_Item;
begin
  StackPos := 0;
  p := List;
  while p <> nil do
  begin
    Stack[StackPos].Level := 1;
    Stack[StackPos].Item := p;
    p := p^.Next;
    Stack[StackPos].Item^.Next := nil;
    Inc(StackPos);
    while (StackPos > 1) and (Stack[StackPos - 1].Level = Stack[StackPos - 2].Level) do 
    begin
      Stack[StackPos - 2].Item := IntersectSorted(Stack[StackPos - 2].Item, Stack[StackPos - 1].Item);
      Inc(Stack[StackPos - 2].Level);
      Dec(StackPos);
    end;
  end;
  while StackPos > 1 do
  begin
    Stack[StackPos - 2].Item := IntersectSorted(Stack[StackPos - 2].Item, Stack[StackPos - 1].Item);
    Inc(Stack[StackPos - 2].Level);
    Dec(StackPos);
  end;
  if StackPos > 0 then
    List := Stack[0].Item;
end;

Сложность алгоритма

Очевидно, сложность алгоритма O(n log n), при этом требования к памяти минимальны O(log n)

Сортировка двусвязного списка

Так как количество операций превосходит количество элементов списка, наиболее оптимальным решением при сортировке двусвязного списка будет отсортировать список как односвязный, используя только указатели на последующие элементы, а после окончания сортировки восстановить указатели на предыдущие элементы. Сложность такой операции всегда O(n).

  type
    PList_Item = ^TList_Item;
    TList_Item = record
      Key: Integer;
      Prev, Next: PList_Item; 
    end;
  var
    // Указатели на первый и последний элемент списка
    First, Last: PList_Item;
  p := First;
  // Проверка, что список не является пустым
  if p <> nil then
  begin  
    p^.Prev := nil;
    while p^.Next <> nil do
    begin
      p^.Next^.Prev := p;
      p := p^.Next;
    end;
  end;
  Last := p;

См. также

Литература

Read other articles:

Haywood Shepherd Hansell, Jr.Mayor Jenderal Haywood S. Hansell Jr.JulukanPossumLahir(1903-09-28)28 September 1903Fort Monroe, VirginiaMeninggal14 November 1988(1988-11-14) (umur 85)Hilton Head, Carolina SelatanDikebumikanPemakaman Akademi Angkatan Udara Amerika SerikatPengabdian Amerika SerikatDinas/cabang Angkatan Udara Amerika SerikatLama dinas1928–19461951–1955Pangkat Mayor JenderalKomandan3rd Bombardment Wing1st Bombardment WingXXI Bomber CommandPerang/pertempuranPerang Duni...

 

René Ríos BoettigerBiographieNaissance 15 décembre 1911ConcepciónDécès 14 juillet 2000 (à 88 ans)SantiagoNom de naissance René Rodolfo Ríos BoettigerPseudonyme PepoNationalité chilienneFormation Université de ConcepciónGerman School Concepción (d)Activité Auteur de bande dessinéePériode d'activité à partir de 1933Autres informationsSite web www.reneriospepo.clŒuvres principales Pobre Diablo (d), Condorito (d)modifier - modifier le code - modifier Wikidata René Ríos B...

 

ウェストバージニア州バークレー郡 郡のウェストバージニア州内の位置 州のアメリカ合衆国内の位置 設立 1772年 郡庁所在地 マーティンズバーグ 面積 - 総面積 - 陸 - 水 834 km2 (322 mi2)834 km2 (322 mi2)0 km2 (0 mi2), 0.14% 人口 - (2020年) - 密度 122,076人 標準時 東部: UTC-5/-4 ウェブサイト www.berkeleycountycomm.org バークレー郡(英...

1996 live album by Die Toten HosenIm Auftrag des Herrn... - Die Toten Hosen LiveLive album by Die Toten HosenReleased25 October 19962007 (jubilee edition)Recorded1996GenrePunk rockLength75:1379:57 (re-release)LabelJKPProducerJon Caffery & Die Toten HosenDie Toten Hosen chronology Opium fürs Volk(1996) Im Auftrag des Herrn... - Die Toten Hosen Live(1996) Wir warten auf's Christkind...(1998) Im Auftrag des Herrn... – Die Toten Hosen Live or just Im Auftrag des Herrn (By order of ...

 

Taeniidae Taenia hydatigena Klasifikasi ilmiah Domain: Eukaryota Kerajaan: Animalia Filum: Platyhelminthes Kelas: Cestoda Ordo: Cyclophyllidea Famili: TaeniidaeLudwig, 1886 Genus Echinococcus Rudolphi, 1801 Hydatigera Lamarck, 1816 Taenia Linnaeus, 1758 Versteria Nakao, Lavikainen, Iwaki, Haukisalmi, Konyaev, Oku, Okamoto & Ito, 2013 [1] Taeniidae /tɪˈnaɪ.ɪdiː/ adalah sebuah keluarga cacing pita (Kelas Cestoda), dan merupakan keluarga terbesar dalam ordo Cyclophyllidea.[2...

 

Pertempuran Teluk ManilaBagian dari Perang Spanyol-AmerikaCetak berwarna kontemporer, menunjukkan USS Olympia di latar depan kiri, memimpin Skuadron Asiatik Amerika Serikat melawan armada kapal Spanyol dekat Cavite. Sebuah potret sketsa dari Laksamana George Dewey ditampilkan di bagian kiri bawah.Tanggal1 Mei 1898LokasiDekat Manila, FilipinaHasil Kemenangan mutlak Amerika SerikatPihak terlibat  Amerika Serikat Kerajaan SpanyolTokoh dan pemimpin George Dewey Patricio MontojoKekuatan ...

2008 studio album by ClarkTurning DragonStudio album by ClarkReleased28 January 2008Genre IDM techno experimental[1] Length46:38LabelWarpProducerChristopher ClarkClark chronology Body Riddle(2006) Turning Dragon(2008) Totems Flare(2009) Professional ratingsReview scoresSourceRatingAllMusic[2]Pitchfork8.2/10[3]Resident Advisor4.0/5[1] Turning Dragon is the fourth studio album by electronic musician Chris Clark and the second one under the moniker Clark. ...

 

18th-century literary pen name Captain Charles JohnsonPen nameCaptain Charles JohnsonYears active1724–1736[1]Notable worksA General History of the Pyrates Captain Charles Johnson was the British author of the 1724 book A General History of the Robberies and Murders of the most notorious Pyrates, whose identity remains a mystery. No record exists of a captain by this name, and Captain Charles Johnson is generally considered a pen name for one of London's writer-publishers. Some ...

 

Le compositeur et pianiste allemand Carl Maria von Weber a laissé un catalogue de plus de 300 œuvres pour diverses formations, abordant tous les genres musicaux à l'exception du ballet. La numérotation de ce catalogue est due au musicologue Friedrich Wilhelm Jähns. Catalogue par numéro d'opus op. Description 1 Six Fuguettes (J. 1-6) pour piano (1798) 2 Variations sur un thème original (J. 7) pour piano (1800) 3 Six Petites pièces (J. 9-14) pour piano à quatre mains (1801) 4 Douze All...

هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (أبريل 2019) يان ستانلي معلومات شخصية الميلاد 14 نوفمبر 1948  ملبورن  تاريخ الوفاة 29 يوليو 2018 (69 سنة) [1]  مواطنة أستراليا  الحياة العملية المهنة لاعب غولف  ال...

 

Para el entrenador de baloncesto, véase Xavier Pascual Vives. Xavier Pascual Fuertes Información personalApodo Pasqui Nacimiento 8 de marzo de 1968 (55 años)Barcelona (España) Nacionalidad EspañolaInformación profesionalOcupación Balonmanista, entrenador y entrenador de balonmano Carrera deportivaDeporte Balonmano Perfil de jugadorPosición guardameta Equipos Fútbol Club Barcelona, Club Handbol Palautordera, Fútbol Club Barcelona, Sociedad Deportiva Teucro, Club Balonmano Ademar Leó...

 

German railway company, 1891–1905 This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Stahlbahnwerke Freudenstein – news · newspapers · books · scholar · JSTOR (July 2014) (Learn how and when to remove this template message) Stahlbahnwerke Freudenstein is a defunct German railway company. Company history Locomotive 73 on displa...

Italian political party Five Star Movement Movimento 5 StelleAbbreviationM5SPresidentGiuseppe ConteGuarantorBeppe GrilloFoundersBeppe GrilloGianroberto CasaleggioFounded4 October 2009; 14 years ago (2009-10-04)HeadquartersVia Campo Marzio 46, RomeNewspaperIl Blog delle Stelle (until 2021)Membership (2019)133,664[1]IdeologyPopulismGreen politicsDirect democracyEuropean Parliament groupEFDD (2014–2019)Non-Inscrits (since 2019)Colors  YellowChamber of Deputies52 ...

 

2008 live album by George CarlinIt's Bad For YaLive album by George CarlinReleasedJuly 29, 2008 [1]RecordedMarch 1, 2008, Wells Fargo Center for the Arts, Santa Rosa, CaliforniaGenreComedyLength67:00LabelEardrum/AtlanticProducerGeorge CarlinGeorge Carlin chronology Life Is Worth Losing(2006) It's Bad For Ya(2008) I Kinda Like It When a Lotta People Die(2016) Wikiquote has quotations related to George Carlin. It's Bad for Ya is the 19th album as well as the 14th and final HBO s...

 

Epistemologi konstruktivis adalah cabang filsafat ilmu yang menyatakan bahwa ilmu alam terdiri dari konstruksi pikiran yang dibuat untuk menjelaskan pengalaman (atau pengukuran) dunia nyata oleh indra tubuh. Menurut paham ini, ilmu pengetahuan dikonstruksi oleh ilmuwan yang berusaha mengukur dan membuat model dunia nyata. Inti Menurut para konstruktivis, dunia terlepas dari pikiran manusia, tetapi pengetahuan tentang dunia adalah konstruksi manusia dan masyarakat.[1] Konstruktivisme m...

A Swedish foot (infantry) regiment during the 17th and 18th century was split into two battalions at the inception of a battle and light field artillery was usually put in the gaps that appeared between those battalions. This sort of artillery was categorized as regimental artillery. Organization The Swedish field artillery consisted of 48 artillery pieces of caliber three to six pounds. The caliber was determined by the weight of the projectile rather than on the diameter of the pipe. There ...

 

Dywizjon Artylerii Konnej Nr 4Reitende Artilleriedivision Nr. 4 Historia Państwo  Austro-Węgry Sformowanie 1908 Rozformowanie 1916 Tradycje Święto 24 czerwca Rodowód 4. Dywizjon Artylerii Konnej Kontynuacja Dywizjon Artylerii Konnej Nr 10Pułk Artylerii Polowej Nr 10 K Działania zbrojne I wojna światowa Organizacja Dyslokacja Budapeszt Rodzaj sił zbrojnych c. i k. Armia Rodzaj wojsk artyleria Podległość 4 Brygada Artylerii PolowejDywizja Kawalerii Temeszwar10 Dywizja Kawalerii...

 

Nama ini menggunakan cara penamaan Portugis. Nama keluarga pertama atau maternalnya adalah de Costa dan nama keluarga kedua atau paternalnya adalah Paes. Eduardo Paes Walikota Rio de JaneiroPetahanaMulai menjabat 1 Januari 2021Wakil WalikotaNilton Caldeira PendahuluMarcelo CrivellaPenggantiPetahanaMasa jabatan1 Januari 2009 – 1 Januari 2017Wakil WalikotaCarlos Alberto MunizAdilson Pires PendahuluCesar MaiaPenggantiMarcelo CrivellaSekretaris Pariwisata, Olahraga dan Rekreasi...

Collection of late antique religio-philosophical texts For the record label discography, see Corpus Hermeticum discography. You can help expand this article with text translated from the corresponding article in Dutch. (March 2022) Click [show] for important translation instructions. View a machine-translated version of the Dutch article. Machine translation, like DeepL or Google Translate, is a useful starting point for translations, but translators must revise errors as necessary and c...

 

Imperial dynasty that ruled Vietnam from 1009 to 1225 This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Lý dynasty – news · newspapers · books · scholar · JSTOR (August 2020) (Learn how and when to remove this template message) Great Cồ Việt大瞿越國Đại Cồ Việt Quốc(1009–1054)Great Việt大...

 

Strategi Solo vs Squad di Free Fire: Cara Menang Mudah!