Quicksort

Quicksort en acción sobre una lista de números aleatorios. Las líneas horizontales son valores pivote.

El ordenamiento rápido (quicksort en inglés) es un algoritmo de ordenacion creado por el científico británico en computación C. A. R. Hoare.

Descripción del algoritmo

El algoritmo trabaja de la siguiente forma:

  • Elegir un elemento del conjunto de elementos a ordenar, al que llamaremos pivote.
  • Resituar los demás elementos de la lista a cada lado del pivote, de manera que a un lado queden todos los menores que él, y al otro los mayores. Los elementos iguales al pivote pueden ser colocados tanto a su derecha como a su izquierda, dependiendo de la implementación deseada. En este momento, el pivote ocupa exactamente el lugar que le corresponderá en la lista ordenada.
  • La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha.
  • Repetir este proceso de forma recursiva para cada sublista mientras éstas contengan más de un elemento. Una vez terminado este proceso todos los elementos estarán ordenados.

Como se puede suponer, la eficiencia del algoritmo depende de la posición en la que termine el pivote elegido.

  • En el mejor caso, el pivote termina en el centro de la lista, dividiéndola en dos sublistas de igual tamaño. En este caso, el orden de complejidad del algoritmo es O(n·log n).
  • En el peor caso, el pivote termina en un extremo de la lista. El orden de complejidad del algoritmo es entonces de O(n²). El peor caso dependerá de la implementación del algoritmo, aunque habitualmente ocurre en listas que se encuentran ordenadas, o casi ordenadas. Pero principalmente depende del pivote, si por ejemplo el algoritmo implementado toma como pivote siempre el primer elemento del array, y el array que le pasamos está ordenado, siempre va a generar a su izquierda un array vacío, lo que es ineficiente.
  • En el caso promedio, el orden es O(n·log n).

No es extraño, pues, que la mayoría de optimizaciones que se aplican al algoritmo se centren en la elección del pivote.

Demostración de un caso particular

Supongamos que el número de elementos a ordenar es una potencia de dos, es decir, para algún natural . Inmediatamente , donde k es el número de divisiones que realizará el algoritmo.

En la primera fase del algoritmo habrá n comparaciones. En la segunda fase el algoritmo instanciará dos sublistas de tamaño aproximadamente n/2. El número total de comparaciones de estas dos sublistas es: 2(n/2) = n. En la tercera fase el algoritmo procesará 4 sublistas más, por tanto el número total de comparaciones en esta fase es 4(n/4) = n.

En conclusión, el número total de comparaciones que hace el algoritmo es:

, donde , por tanto el Orden de Complejidad del algoritmo en el mejor de los casos es .

Técnicas de elección del pivote

El algoritmo básico del método Quicksort consiste en tomar cualquier elemento de la lista al cual denominaremos como pivote, dependiendo de la partición en que se elija, el algoritmo será más o menos eficiente.

  • Tomar un elemento cualquiera como pivote tiene la ventaja de no requerir ningún cálculo adicional, lo cual lo hace bastante rápido. Sin embargo, esta elección «a ciegas» siempre provoca que el algoritmo tenga un orden de O(n²) para ciertas permutaciones de los elementos en la lista.
  • Otra opción puede ser recorrer la lista para saber de antemano qué elemento ocupará la posición central de la lista, para elegirlo como pivote. Esto puede hacerse en O(n) y asegura que hasta en el peor de los casos, el algoritmo sea O(n·log n). No obstante, el cálculo adicional rebaja bastante la eficiencia del algoritmo en el caso promedio.
  • La opción a medio camino es tomar tres elementos de la lista - por ejemplo, el primero, el segundo, y el último - y compararlos, eligiendo el valor del medio como pivote.

Técnicas de reposicionamiento

Una idea preliminar para ubicar el pivote, en su posición final sería contar la cantidad de elementos menores que él, y colocarlo un lugar más arriba, moviendo luego todos esos elementos menores que él a su izquierda, para que pueda aplicarse la recursividad.

Existe, no obstante, un procedimiento mucho más efectivo. Se utilizan dos índices: i, al que llamaremos índice izquierdo, y j, al que llamaremos índice derecho. El algoritmo es el siguiente:

  • Recorrer la lista simultáneamente con i y j: por la izquierda con i (desde el primer elemento), y por la derecha con j (desde el último elemento).
  • El iterador i se incrementa unicamente si lista[i] es menor que el pivote, mientras que j solo decrece si lista[j] es mayor que el pivote.
  • Cuando lista[i] sea mayor que el pivote y lista[j] sea menor, se intercambian los elementos en esas posiciones permitiendo que se incrementen ambos iteradores.
  • Repetir esto hasta que se crucen los índices.
  • El punto en que se cruzan los índices es la posición adecuada para colocar el pivote, porque sabemos que a un lado los elementos son todos menores y al otro son todos mayores (o habrían sido intercambiados).

Transición a otro algoritmo

Como se mencionó anteriormente, el algoritmo quicksort ofrece un orden de ejecución O(n²) para ciertas permutaciones "críticas" de los elementos de la lista, que siempre surgen cuando se elige el pivote «a ciegas». La permutación concreta depende del pivote elegido, pero suele corresponder a secuencias ordenadas. Se tiene que la probabilidad de encontrarse con una de estas secuencias es inversamente proporcional a su tamaño.

  • Los últimos pases de quicksort son numerosos y ordenan cantidades pequeña de elementos. Un porcentaje medianamente alto de ellos estarán dispuestos de una manera similar al peor caso del algoritmo, volviendo a éste ineficiente. Una solución a este problema consiste en ordenar las secuencias pequeñas usando otro algoritmo. Habitualmente se aplica el algoritmo de inserción para secuencias de tamaño menores de 8-15 elementos.
  • Pese a que en secuencias largas de elementos la probabilidad de hallarse con una configuración de elementos "crítica" es muy baja, esto no evita que sigan apareciendo (a veces, de manera intencionada). El algoritmo introsort es una extensión del algoritmo quicksort que resuelve este problema utilizando heapsort en vez de quicksort cuando el número de recursiones excede al esperado.

Nota: Los tres parámetros de la llamada inicial a Quicksort serán array[0], 0, numero_elementos -1, es decir, si es un array de 6 elementos array, 0, 5

Ejemplo

En el siguiente ejemplo se marcan el pivote y los índices i y j con las letras p, i y j respectivamente.

  1. Comenzamos con la lista completa. El elemento pivote será el 4:
     5 - 3 - 7 - 6 - 2 - 1 - 4
                             p
    
  2. Comparamos con el 5 por la izquierda y el 1 por la derecha.
     5 - 3 - 7 - 6 - 2 - 1 - 4 
     i                   j   p
    
  3. 5 es mayor que 4 y 1 es menor. Intercambiamos:
     1 - 3 - 7 - 6 - 2 - 5 - 4
     i                   j   p 
    
  4. Avanzamos por la izquierda y la derecha:
     1 - 3 - 7 - 6 - 2 - 5 - 4
         i           j       p 
    
  5. 3 es menor que 4: avanzamos por la izquierda. 2 es menor que 4: nos mantenemos ahí.
     1 - 3 - 7 - 6 - 2 - 5 - 4
             i       j       p 
    
  6. 7 es mayor que 4 y 2 es menor: intercambiamos.
     1 - 3 - 2 - 6 - 7 - 5 - 4
             i       j       p 
    
  7. Avanzamos por ambos lados:
     1 - 3 - 2 - 6 - 7 - 5 - 4
                iyj          p 
    
  8. En este momento termina el ciclo principal, porque los índices se cruzaron. Ahora intercambiamos lista[i] con lista[p] (pasos 16-18):
     1 - 3 - 2 - 4 - 7 - 5 - 6
                 p 
    
  9. Aplicamos recursivamente a la sublista de la izquierda (índices 0 - 2). Tenemos lo siguiente:
     1 - 3 - 2 
    
  10. 1 es menor que 2: avanzamos por la izquierda. 3 es mayor: avanzamos por la derecha. Como se intercambiaron los índices termina el ciclo. Se intercambia lista[i] con lista[p]:
     1 - 2 - 3 
    
  11. El mismo procedimiento se aplicará a la otra sublista. Al finalizar y unir todas las sublistas queda la lista inicial ordenada en forma ascendente.
     1 - 2 - 3 - 4 - 5 - 6 - 7
    

Véase también

Enlaces externos

Read other articles:

Bassel KhartabilNama asalباسل خرطبيلLahir(1981-05-22)22 Mei 1981Damaskus, SuriahMeninggal3 Oktober 2015(2015-10-03) (umur 34)[1][2]Rumah Tahanan Adra, SuriahKebangsaanSuriahPekerjaanInsinyur perangkat lunakDikenal atasAiki Framework, Openclipart, Open Font Library, Fabricatorz, Mozilla, Creative CommonsSuami/istriNoura Ghazi ​(m. 2013⁠–⁠2015)​PenghargaanIndex on Censorship 2013 Digital Freedom AwardTanda tang...

此條目需要擴充。 (2017年2月9日)请協助改善这篇條目,更進一步的信息可能會在討論頁或扩充请求中找到。请在擴充條目後將此模板移除。 部分人智學基於人智學 一般 人智學 · 鲁道夫·施泰纳人智學學會 · 歌德紀念館 人智學啟發性工作 华德福教育 生物動力農法 人智學醫學 坎皮爾運動 · 優律思美 哲學 自由的哲學 · 社會三層化論 查论编 生物動力農法(英...

Leonard Ochtman Información personalNacimiento 21 de octubre de 1854 Zonnemaire (Países Bajos) Fallecimiento 27 de octubre de 1934 Greenwich (Estados Unidos) Nacionalidad NeerlandesaFamiliaCónyuge Mina Fonda Ochtman EducaciónEducado en Liga de estudiantes de arte de Nueva York Información profesionalOcupación Pintor Movimiento Impresionismo Miembro de Academia Estadounidense de las Artes y las Letras Firma [editar datos en Wikidata] Leonard Ochtman (21 de octubre de 1854 - 27 ...

Leading advocate for surgical standards in Australia and New Zealand The Royal Australasian College of SurgeonsCollege coat of arms, granted in 1931.AbbreviationRACSFormation1927PurposeSurgeryHeadquartersMelbourne, AustraliaLocationAustraliaRegion served Australia, New Zealand & Asia-Pacific regionOfficial language EnglishPresidentAssociate Professor Kerin FieldingWebsitehttps://www.surgeons.org Royal Australasian College of Surgeons building, south facade The Royal Australasian College o...

Santa María, SantiaguitoPhía Santiaguito từ đỉnh Santa MaríaĐộ cao3.772 m (12.375 ft)Vị tríSanta María, SantiaguitoGuatemalaVị tríQuetzaltenango, GuatemalaDãy núiSierra MadreTọa độ14°45′20″B 91°33′6″T / 14,75556°B 91,55167°T / 14.75556; -91.55167Địa chấtKiểuNúi lửa dạng tầngCung/vành đai núi lửaVòng cung núi lửa Trung MỹPhun trào gần nhất1922 đến nay Núi lửa Santa María là một ngọn n

The canton of Le Mont-Blanc in Haute-Savoie The canton of Le Mont-Blanc (French: Canton du Mont-Blanc) is an administrative division of the Haute-Savoie department, Southeastern France. It elects two members of the Departmental Council of Haute-Savoie, known as departmental councillors (conseillers départementaux). It was created at the 2014 cantonal reorganisation process, which came into effect for the 2015 departmental election. Its seat is Passy, its most populated commune.[1] Th...

Football match2011 Trophée des Champions Lille Marseille Ligue 1 Ligue 1 4 5 Date27 July 2011VenueStade de Tanger, Tanger, MoroccoRefereeBouchaïb El Ahrach (Morocco)Attendance33,900WeatherClear26 °C (79 °F)[1]← 2010 2012 → The 2011 Trophée des champions (English: 2011 Champions Trophy) was the 16th edition of the French super cup. The match was to be contested by the winners of Ligue 1 the previous season, Lille, and the defending Coupe de France champions. ...

This article needs to be updated. Please help update this article to reflect recent events or newly available information. (October 2023) Part of the Politics seriesDirect democracy Referendum types Optional referendum Legislative referral Popular initiative Recall referendum Popular referendum Mandatory referendum Referendums by country Australia Canada Czechia EU France Germany Italy Iran Israel Kenya Lithuania Netherlands New Zealand Poland Philippines Sweden Slovakia Switzerland Turkey Ta...

Newmarket ParkThe park's entrance in the west, off Sarawia StreetLocationNewmarket, AucklandCoordinates36°51′53″S 174°47′00″E / 36.8646°S 174.7833°E / -36.8646; 174.7833Area6 haOperated byAuckland Council Newmarket Park is an approximately 6-hectare-large (15-acre) park in Auckland, New Zealand.[1] It is located in the triangle between three suburbs, northeast of the Newmarket, southeast of Parnell and northwest of Remuera. It is located p...

Japanese television series 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: Pingu in the City – news · newspapers · books · scholar · JSTOR (May 2018) (Learn how and when to remove this template message) Pingu in the CityEnglish LogoGenreComedyComputer-animatedBased onPingu by Otmar Gutmann and Erika Brueggem...

Bagian dari seri tentangEkaristi Perjamuan Kudus • Komuni Unsur Roti Anggur Ritual dan liturgi Liturgi Ilahi Perjamuan Tuhan Pemecahan Roti Misa Requiem Solemnis Konsekrasi/Anafora Epiklesis Kisah Institusi Anamnesis Amalan dan kebiasaan Meja Tertutup dan Terbuka Perjamuan kudus dalam dua rupa Adorasi Disiplin Pengucapan Syukur Sakramen cadangan Pesta Corpus Christi Komuni Pertama Komuni kanak-kanak Viaticum Wadah Patena Piala Sejarah Asal mula Ekaristi Akar Sejarah Teologi Kehadiran Nyata ...

يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (مايو 2023) هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (�...

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: Mamidipudi Venkatarangayya – news · newspapers · books · scholar · JSTOR (May 2022) (Learn how and when to remove this template message) Mamidipudi VenkatarangaiyaBorn8 January 1889Purini, Nellore district, Madras Presidency, British IndiaDied13 January 1982(19...

Hindu temple in Kerala, India Veeranimangalam Mahadeva TempleSanctum SanctorumReligionAffiliationHinduismDistrictThrissurDeityShiva, NarasimhaFestivalsMaha Shivaratri, Narasimha JayantiLocationLocationEnkakkadStateKeralaCountry IndiaGeographic coordinates10°39′19″N 76°15′27″E / 10.655212549887521°N 76.25749204258511°E / 10.655212549887521; 76.25749204258511ArchitectureTypeKerala styleCompletedmore than 1000 yearsTemple(s)2 Veeranimangalam Mahadeva Temp...

Artikel atau sebagian dari artikel ini mungkin diterjemahkan dari List of Hitohira episodes di en.wikipedia.org. Isinya masih belum akurat, karena bagian yang diterjemahkan masih perlu diperhalus dan disempurnakan. Jika Anda menguasai bahasa aslinya, harap pertimbangkan untuk menelusuri referensinya dan menyempurnakan terjemahan ini. Anda juga dapat ikut bergotong royong pada ProyekWiki Perbaikan Terjemahan. (Pesan ini dapat dihapus jika terjemahan dirasa sudah cukup tepat. Lihat pula: pandua...

Inventory StelaTypeStelaMaterialLimestoneHeight70 centimetres (28 in)Width42 centimetres (17 in)WritingEgyptian hieroglyphsPeriod/cultureSaite PeriodDiscovered1858Giza Plateau, Egypt29°58′40″N 31°08′11″E / 29.97786°N 31.13645°E / 29.97786; 31.13645Discovered byAuguste MariettePresent locationEgyptian MuseumRegistrationJE 2091 The Inventory Stela (also known as Stela of Khufu's Daughter) is an ancient Egyptian commemorative tablet dating to the 26t...

فاطمة بن سعيدان معلومات شخصية الميلاد 25 ديسمبر 1949 (العمر 73 سنة)تونس العاصمة  الجنسية  تونس الحياة العملية المهنة ممثلة،  وممثلة أفلام،  وممثلة مسرحية  المواقع IMDB صفحتها على IMDB  تعديل مصدري - تعديل   فاطمة بن سعيدان (25 ديسمبر 1949) ممثلة سينمائية ومسرحية تونسية...

Sports stadium in Alanya, Turkey Alanya Oba StadyumuLocationAlanya, TurkeyCoordinates36°33′45″N 32°04′45″E / 36.56261°N 32.07916°E / 36.56261; 32.07916Capacity10,128[1]Record attendance8,679 (Alanyaspor-Fenerbahçe, 16 September 2019) [2]SurfaceGrassConstructionBroke ground1995Opened2011Construction cost$ 8 millionTenantsAlanyaspor (2011–present) Turkey national football team (selected matches) The Alanya Oba Stadium is a multi-purpos...

Village in Saskatchewan, CanadaNorth PortalVillageVillage of North PortalNorth PortalShow map of Coalfields No. 4North PortalShow map of SaskatchewanNorth PortalShow map of North AmericaCoordinates: 49°00′05″N 102°33′14″W / 49.0015°N 102.5539°W / 49.0015; -102.5539CountryCanadaProvinceSaskatchewanRegionSaskatchewanCensus division1Rural MunicipalityCoalfieldsPost office FoundedN/AIncorporated (Village)N/AIncorporated (Town)N/AGovernment • MayorMu...

Building in Neuhausen am Rheinfall, SwitzerlandSchlösschen WörthSchlössli WörthRheinfall, the Rhein river and Schloss Laufen as seen from the Wörth CastleLocation within Canton of SchaffhausenShow map of Canton of SchaffhausenWörth Castle (Switzerland)Show map of SwitzerlandFormer namesBurg im FischerhölzliGeneral informationStatusRestaurant, shop, fast food point, Rhein boat terminalArchitectural styleWater castleClassificationHistoric monumentTown or cityNeuhausen am RheinfallCountry...