Daha çox

Sütuna görə sifariş, Sütun bir Tamsayı sütunu olduğu kimi sıralanır


Sual çox asandır. Bir Tamsayı sütununun adi sıralanması həqiqətən pisdir. 1,2,3… 11,12 və s. Kimi ehtiyacım var. Ancaq hal hazırda 1,10,11… 2,20 kimi ...

Budur bir şəkil

Bunu dəyişdirməyin asan yolu varmı? 1 gedən "01" etmədən demək istəyirəm və ya bu cür fəndlər ən yaxşısı olardı.

Bu String sütunu deyil

Burada işləmir. Budur işləyir.

Hər iki halda da int.


Şəxsiyyət vəsiqənizin bir sətir olması ehtimalı yüksəkdir. Sahələr nişanının altındakı təbəqə xüsusiyyətləri pəncərəsində onu yoxlaya bilərsiniz. Əgər belədirsə, tam bir yeni bir ID sahəsi yaradın və onu simli-id dəyərləri ilə bəsləyin. misala baxın: və bunun yerinə bir tam istifadə etmək:


Birləşdirilmiş sütun, doğru indeks olsa da tam masa taramasına səbəb olur

Date_added sütununun sifariş etdiyi cədvəl məlumat dəstlərindən ilk bir neçə satırı almaq istədiyim bir sorğum var. Sıralanan sütun indeksləşdirilir, buna görə bu cədvəlin əsas versiyası çox sürətlidir:

Ancaq sorğunu bir az daha mürəkkəbləşdirdikdən sonra bir problemim var. Çoxdan çoxlu münasibətləri təmsil edən başqa bir cədvələ qoşulmaq və nəticələri bir sıra sütununa toplamaq istəyirəm. Bunu etmək üçün bir QRUP BY id müddəasını əlavə etməliyəm:

Sadəcə GROUP BY bəndini əlavə etməklə sorğu əvvəllər olduğu kimi date_added sütunda indeksdən istifadə etmək əvəzinə verilənlər cədvəlinin tam taramasını edir.

İstədiyim faktiki sorğunun sadələşdirilmiş versiyası aşağıdakılardır:

GROUP BY maddəsi niyə indeksin laqeyd edilməsinə səbəb olur və tam masa taramasına məcbur edir? Və bu sorğunu sıraladığı sütundakı indeksdən istifadə etməsi üçün yenidən yazmağın bir yolu varmı?

Windows-da Postgres 9.5.4 istifadə edirəm, sözügedən cədvəldə hazırda 5000 satır var, ancaq bir neçə yüz min ola bilər. ANALİZ TƏHLİLİ vermədən əvvəl hər iki cədvəldə əllə TƏHLİL işlədim.

İlgili olmayan sütunları olan d məlumat dəstlərinin çıxışı anonimdir:


Cədvəlin birdən çox sütunu ilə sifariş verin

Tələbələrin siyahısını işarələrinə və adlarına görə göstərə bilərik. Bu işarənin artan qaydasında siyahını verəcəkdir. Birdən çox tələbə eyni işarəni aldıqda (deyək 88), adları əlifba sırası ilə veriləcəkdir.

Beləliklə siyahı göstərilir Bigy yuxarıda Giff Tow hər ikisi də bərabər qiymət alsalar da (88 deyin)

Adların sırasını dəyişdirmək istəyirsinizsə, sorğunu belə dəyişə bilərsiniz. İstəyirsinizsə siyahı ən yüksək nişandan ən aşağı nişana qədər olmalıdır, sorğu belə olmalıdır


Sütuna görə Sətir bir Tamsayı sütunu olduğu kimi sıralanır - Coğrafi İnformasiya Sistemləri

Bəzi hallarda, MySQL bir SİFARİŞ BY müddəasını təmin etmək üçün bir indeksdən istifadə edə bilər və sənədlər əməliyyatının yerinə yetirilməsində iştirak edən əlavə çeşidlənmənin qarşısını alır.

SİFARİŞ BY, indeksin bütün istifadə olunmamış hissələri və bütün əlavə SİFARİŞ BY sütunları WHERE bəndindəki sabitlər olduğu müddətcə indekslə tam uyğun gəlmirsə də indeks istifadə edilə bilər. İndeks sorğunun daxil olduğu bütün sütunları içərmirsə, indeks yalnız indeks girişi digər giriş metodlarına nisbətən ucuz olduqda istifadə olunur.

Üzərində bir indeks olduğunu fərz etmək key_part1 , açar_hissə2 ), aşağıdakı sorğular SİFARİŞ EDƏN hissəni həll etmək üçün indeksdən istifadə edə bilər. Optimizatorun həqiqətən bunu edib etməməsi, indeksdə olmayan sütunların da oxunması lazım olduğu təqdirdə indeksin oxunmasının masa taramasından daha səmərəli olub-olmamasından asılıdır.

Bu sorğuda, ( key_part1 , açar_hissə2 ) optimizatorun çeşidlənməməsini təmin edir:

Bununla birlikdə, sorğuda SELECT * istifadə olunur, bunlardan daha çox sütun seçə bilər key_part1açar_hissə2 . Bu vəziyyətdə, indeksin hamısını taramaq və indeksdə olmayan sütunları tapmaq üçün cədvəl sətirlərinə baxmaq cədvəli taramaqdan və nəticələri sıralamaqdan daha baha ola bilər. Əgər belədirsə, optimizatorun indeksdən istifadə etməsi ehtimalı yoxdur. SELECT * yalnız indeks sütunlarını seçirsə, indeks istifadə olunur və çeşidlənmədən qaçınılır.

T1 bir InnoDB cədvəlidirsə, cədvəlin əsas açarı indeksin bir hissəsidir və indeks bu sorğu üçün SİFARİŞ BY həll etmək üçün istifadə edilə bilər:

Bu sorğuda, key_part1 sabitdir, buna görə indeks vasitəsilə əldə edilən bütün satırlar içərisindədir açar_hissə2 sifariş və (və key_part1 , açar_hissə2 ) WHERE bəndində bir index aralığı taramasını masa taramasından daha ucuz etmək üçün seçicidirsə, çeşidlənmədən yayınır:

Növbəti iki sorğuda indeksin istifadə olunub-olunmaması əvvəllər göstərilən DESC olmadan eyni sorğulara bənzəyir:

Növbəti iki sorğuda, key_part1 sabit ilə müqayisə olunur. İndeks, WHERE bəndində bir index aralığı taramasını masa taramasından daha ucuz etmək üçün kifayət qədər seçicidirsə istifadə olunur:

Növbəti sorğuda SİFARİŞ BY ad vermir key_part1 , lakin seçilmiş bütün sətirlərin sabitləri var key_part1 dəyər, buna görə indeks hələ də istifadə edilə bilər:

Bəzi hallarda, MySQL edə bilməz Sifarişi həll etmək üçün indekslərdən istifadə edin, baxmayaraq ki HARADA bəndinə uyğun satırları tapmaq üçün indekslərdən istifadə edə bilər. Nümunələr:

Sorğu müxtəlif indekslərdə SİFARİŞ BY istifadə edir:

Sorğu indeksin ardıcıl olmayan hissələrində SİFARİŞ BY istifadə edir:

Sorğuda ASC və DESC qarışdırılır:

Satırları gətirmək üçün istifadə olunan SİFARİŞDƏ istifadə ediləndən fərqlənir:

Sorğuda SİFARİŞ BY, indeks sütun adından başqa şərtləri ehtiva edən bir ifadə ilə istifadə olunur:

Sorğu bir çox cədvələ qoşulur və SİFARİŞ BY-dəki sütunlar hamısı satır almaq üçün istifadə olunan qeyri-sabit cədvəldən deyil. (Bu, EXPLAIN çıxışında const birləşdirmə növü olmayan ilk cədvəldir.)

Sorğu müxtəlif SİFARİŞ VƏ QRUP BY ifadələrinə malikdir.

SİFARİŞ BY bəndində adlanan bir sütunun yalnız bir prefiksində bir indeks var. Bu halda, indeks sıralama qaydasını tam həll etmək üçün istifadə edilə bilməz. Məsələn, bir CHAR (20) sütununun yalnız ilk 10 baytı indeksləşdirilirsə, indeks 10 baytdan keçmiş dəyərləri ayırd edə bilmir və bir fayl aralığına ehtiyac var.

İndeks sıraları qaydada saxlamır. Məsələn, bu, YADDA cədvəlindəki HASH indeksi üçün doğrudur.

Sıralama üçün bir indeksin mövcudluğu sütun takma adlarının istifadəsindən təsirlənə bilər. T1.a sütununun indeksləndiyini düşünək. Bu açıqlamada, seçim siyahısındakı sütunun adı a. SİFARİŞ EDƏN SİFARİŞdəki bir a istinad etdiyi kimi t1.a aiddir, buna görə də t1.a indeksindən istifadə edilə bilər:

Bu açıqlamada, seçilənlər siyahısındakı sütunun adı da a, lakin təxəllüs adıdır. SİFARİŞ EDƏN SİFARİŞDƏ a-ya istinad olduğu kimi ABS-ə (a) aiddir, buna görə də t1.a-dakı indeks istifadə edilə bilməz:

Aşağıdakı açıqlamada SİFARİŞ, seçilmiş siyahıda bir sütunun adı olmayan bir ada aiddir. Ancaq t1-də a adlı bir sütun var, buna görə SİFARİŞ BY t1.a istinad edir və t1.a-dakı indeksdən istifadə edilə bilər. (Nəticədə sıralama əmri, əlbəttə ki, ABS (a) üçün olan sifarişdən tamamilə fərqli ola bilər.)

Varsayılan olaraq, MySQL GROUP BY sıralayır col1 , col2 ,. SİFARİŞ BY-ni də daxil etmiş kimi sorğular col1 , col2 ,. sorğuda. Eyni sütun siyahısını ehtiva edən açıq SİFARİŞ BY bəndini daxil etsəniz, çeşidləmə hələ də baş versə də, MySQL sürət cəzası olmadan onu optimallaşdırır.

Bir sorğuda GROUP BY daxildirsə, ancaq nəticəni çeşidləmək üçün yüklənmədən qaçmaq istəyirsinizsə, SİFARİŞ BY NULL təyin edərək çeşidlənməni boğa bilərsiniz. Misal üçün:

Optimizator yenə də qruplaşdırma əməliyyatlarını həyata keçirmək üçün çeşidləmə istifadə edə bilər. SİFARİŞ NULL, nəticəni təyin etmək üçün əməliyyatlar qruplaşdırmaqla əvvəlcədən çeşidləmə deyil, nəticənin çeşidlənməsini basdırır.

GROUP BY dolayı olaraq standart olaraq sıralayır (yəni GROUP BY sütunları üçün ASC və ya DESC təyinediciləri olmadıqda). Bununla birlikdə, gizli GROUP BY çeşidlənməsinə (yəni ASC və ya DESC təyinediciləri olmadıqda çeşidləmə) və ya GROUP BY (yəni GROUP BY sütunları üçün açıq ASC və ya DESC təyinedicilərindən istifadə etməklə) üçün çeşidlənməyə etibar edilmir. Müəyyən bir sifariş sifariş etmək üçün SİFARİŞ BY maddəsini təqdim edin.

SİFARİŞƏ QAZANMAQ ÜÇÜN FİLT SİSTEMİNDƏN istifadə

Bir SİFARİŞ BY müddəasını təmin etmək üçün bir indeksdən istifadə edilə bilmirsə, MySQL cədvəl sətirlərini oxuyan və sıralayan bir sənəd aralığında əməliyyat həyata keçirir. Bir sənədlər sorğusu icrasında əlavə bir çeşidləmə mərhələsi təşkil edir.

Dosyalarla işləmə əməliyyatları üçün yaddaş əldə etmək üçün optimallaşdırıcı sabit bir miqdarda sort_buffer_size bayt ayırır. Fərdi seanslar, həddindən artıq yaddaş istifadəsinin qarşısını almaq və ya lazım olduqda daha çox yaddaş ayırmaq üçün bu dəyişənin sessiya dəyərini istədiyi kimi dəyişdirə bilər.

Nəticə dəsti yaddaşa sığmayacaq qədər böyükdürsə, sənədlərin təhlili əməliyyatı lazım olduqda müvəqqəti disk sənədlərindən istifadə edir. Bəzi sorğu növləri tamamilə yaddaşda olan sənədlər əməliyyatları üçün xüsusilə uyğundur. Məsələn, optimallaşdırıcı, aşağıdakı formalı sorğular (və alt sorğular) üçün SİFARİŞ BY əməliyyatı müvəqqəti sənədlər olmadan yaddaşda səmərəli işləmək üçün filesort istifadə edə bilər:

Bu cür sorğular daha böyük nəticə dəstindən yalnız bir neçə sətir göstərən veb tətbiqetmələrdə yaygındır. Nümunələr:

SİFARİŞİ Optimallaşdırma yolu ilə təsir etmək

Fileort istifadə olunmayan yavaş SİFARİŞ sorğuları üçün, max_length_for_sort_data sistem dəyişənini bir fileort'u işə salmaq üçün uyğun bir dəyərə endirməyə çalışın. (Bu dəyişənin dəyərini çox yüksək təyin etmə əlaməti yüksək disk aktivliyi və aşağı CPU fəaliyyətinin birləşməsidir.)

SİFARİŞ EDƏN sürəti artırmaq üçün MySQL-dən əlavə bir çeşidləmə mərhələsindən daha çox indeks istifadə edə biləcəyinizi yoxlayın. Bu mümkün deyilsə, aşağıdakı strategiyaları sınayın:

Sort_buffer_size dəyişən dəyərini artırın. İdeal olaraq, dəyər, bütün nəticənin çeşidləmə tamponuna sığması üçün kifayət qədər böyük olmalıdır (diskə yazılmaması və keçidləri birləşdirməmək üçün), lakin ən azı 15 limiti yerləşdirəcək qədər böyük olmalıdır. (15-ə qədər müvəqqəti disk faylı birləşdirilir və yaddaşda hər fayl üçün ən azı bir cüt üçün yer olmalıdır.)

Sıralama tamponunda saxlanılan sütun dəyərlərinin ölçüsünün max_sort_length sistem dəyişən dəyərindən təsirləndiyini nəzərə alın. Məsələn, kanallar uzun simli sütunların dəyərlərini saxlayırsa və siz max_sort_length dəyərini artırırsınızsa, sort bufer qapaqlarının ölçüsü də artır və sort_buffer_size artırmağınızı tələb edə bilər. Simli ifadələr nəticəsində hesablanan sütun dəyərləri üçün (misal üçün simli dəyərləndirilmiş bir funksiyanı işləyənlər kimi), faylortu alqoritmi ifadə dəyərlərinin maksimum uzunluğunu deyə bilməz, ona görə də hər cədvəl üçün max_sort_length bayt ayırmalıdır.

Birləşdirmə keçidlərinin sayını izləmək üçün (müvəqqəti faylları birləşdirmək üçün), Sort_merge_passes status dəyişənini yoxlayın.

Read_rnd_buffer_size dəyişən dəyərini artırın ki, hər dəfə daha çox satır oxunsun.

Tmpdir sistem dəyişənini böyük həcmdə boş yerə malik xüsusi bir fayl sisteminə yönəltmək üçün dəyişdirin. Dəyişən dəyər dəyirmi qaydada istifadə olunan bir neçə yolu göstərə bilər, bu xüsusiyyəti yükü bir neçə qovluqda yaymaq üçün istifadə edə bilərsiniz. Yolları Unix-də iki nöqtəli simvollarla (:) və Windows-da nöqtəli vergül simvollarla () ayırın. Yollar fərqli yerləşən fayl sistemlərindəki qovluqlara ad verməlidir fiziki disklər, eyni diskdəki fərqli bölmələr deyil.

SİFARİŞ İcra Planı Məlumatı mövcuddur

AÇIKLAMA ilə (bax Bölmə 8.8.1, “SORĞULARI İZLƏMƏ ilə optimallaşdırma”), MySQL-in SİFARİŞ BY maddəsini həll etmək üçün indekslərdən istifadə edib-etməyəcəyini yoxlaya bilərsiniz:

EXPLAIN çıxışının Əlavə sütununda Fileort istifadə edilmirsə, indeks istifadə olunur və fayl siyahısı yerinə yetirilmir.

EXPLAIN çıxışının Əlavə sütununda Useing fileort istifadə olunursa, indeks istifadə olunmur və bir fileort yerinə yetirilir.

Bundan əlavə, bir sənəd arayışı yerinə yetirilirsə, optimizator izləmə çıxışı bir filesort_summary blokunu ehtiva edir. Misal üçün:

Sort_mode dəyəri, sıralama buferindəki qapıların məzmunu haqqında məlumat verir:

& ltsort_key, rowid & gt: Bu, sıralama bufer cədvəllərinin, orijinal cədvəl sətrinin sıralama açarı dəyərini və sətir kimliyini ehtiva edən cütlər olduğunu göstərir. Tupllar sıralama açar dəyəri ilə sıralanır və sətir kimliyi cədvəldən sətri oxumaq üçün istifadə olunur.

& ltsort_key, additional_fields & gt: Bu, sıralama bufer cədvəllərində sorğunun istinad etdiyi sort sort dəyərini və sütunları ehtiva etdiyini göstərir. Tupllar çeşid açar dəyəri ilə sıralanır və sütun dəyərləri birbaşa qapıdan oxunur.

& ltsort_key, packed_additional_fields & gt: Əvvəlki variant kimi, lakin əlavə sütunlar sabit uzunluqlu bir kodlama istifadə etmək əvəzinə bir-birinə sıx şəkildə doludur.

EXPLAIN, optimizatorun yaddaşda bir sənəd çeşidi etməsini və ya etməməsini fərqləndirmir. Yaddaş içərisindəki sənədlərin istifadəsi optimizator izləmə çıxışında görünə bilər. Filesort_priority_queue_optimization axtarın. Optimizator izi haqqında məlumat üçün MySQL İnternals: Optimizatorun İzlənməsi bölməsinə baxın.


Mündəricat

Hesablamanın başlanğıcından etibarən çeşidləmə problemi, bəlkə də sadə, tanış ifadəsinə baxmayaraq səmərəli həll edilməsinin mürəkkəbliyi səbəbindən çox araşdırma cəlb etdi. 1951-ci ilə yaxın erkən çeşidləmə alqoritmlərinin müəllifləri arasında ENIAC və UNIVAC-da işləyən Betty Holberton (anadan olan Snyder) var. [1] [2] Bubble sortu 1956-cı ildə təhlil edilmişdir. [3] Müqayisə çeşidləmə alqoritmlərinin requirement (n giriş n) müqayisələr (bəzi giriş ardıcıllıqları çoxlu tələb edəcəkdir n giriş n müqayisələr, burada n - sıralanacaq massivdəki elementlərin sayı). Müqayisələrə əsaslanmayan alqoritmlər, məsələn, sayma növü, daha yaxşı bir performans göstərə bilər. Asimptotik cəhətdən optimal alqoritmlər 20-ci əsrin ortalarından bəri məlumdur - faydalı yeni alqoritmlər hələ də icad olunur, hazırda geniş istifadə olunan Timsort 2002-ci ilə aiddir və kitabxana növü ilk dəfə 2006-cı ildə nəşr edilmişdir.

Sorğu üçün alqoritmlərin bolluğunun, böyük O qeydləri, alqoritmləri bölmək və fəth etməsi, yığınlar və ikili ağaclar kimi məlumat strukturları kimi müxtəlif əsas alqoritm anlayışlarına zərif bir giriş təmin etdiyi giriş kompüter elmləri dərslərində çeşidləmə alqoritmləri üstünlük təşkil edir. təsadüfi alqoritmlər, ən yaxşı, ən pis və orta vəziyyət təhlili, zaman məkanında ticarət və yuxarı və aşağı sərhədlər.

Kiçik massivləri optimal şəkildə (ən azı müqayisə və svop) və ya sürətli (yəni maşının spesifik detalları nəzərə alınmaqla) sıralamaq hələlik yalnız çox kiçik massivlər (& lt20 elementləri) üçün məlum olan açıq bir araşdırma problemidir. Paralel dəzgahda eyni dərəcədə optimal (müxtəlif təriflərə görə) çeşidləmə açıq tədqiqat mövzusudur.

Çeşidləmə alqoritmləri tez-tez aşağıdakı kimi təsnif edilir:

    siyahının ölçüsü baxımından (ən pis, orta və ən yaxşı davranış)n). Tipik serial çeşidləmə alqoritmləri üçün yaxşı davranış O (n giriş n), O-da paralel sıralama ilə (log 2 n) və pis davranış O (n 2). (Big O notation-a baxın.) Serial sort üçün ideal davranış O (n), lakin orta vəziyyətdə bu mümkün deyil. Optimal paralel çeşidləmə O (log n). Müqayisə əsaslı çeşidləmə alqoritmlərinə ən azı need (n giriş n) ən çox giriş üçün müqayisə. svopların ("yerində" alqoritmləri üçün). istifadə (və digər kompüter mənbələrinin istifadəsi). Xüsusilə, bəzi çeşidləmə alqoritmləri "yerindədir". Qəti olaraq, yerdəki bir sıraya bəzən O (log (n)) əlavə yaddaş "yerində" sayılır.
  • Rekursiya. Bəzi alqoritmlər ya rekursiv, ya da qeyri-rekursivdir, digərləri isə hər ikisi də ola bilər (məsələn, birləşmə növü).
  • Stabillik: sabit çeşidləmə alqoritmləri qeydlərin nisbi sırasını bərabər düymələrlə (yəni dəyərlər) qoruyur.
  • Bir müqayisə növü olub-olmaması. Müqayisə sortu yalnız iki elementi müqayisə operatoru ilə müqayisə edərək məlumatları araşdırır.
  • Ümumi metod: yerləşdirmə, mübadilə, seçim, birləşmə, və s. Mübadilə növlərinə qabarcıq çeşidlənməsi və sürətləndirmə daxildir. Seçmə növlərinə çalkalayıcı çeşidi və yığma növü daxildir.
  • Alqoritmin serial və ya paralel olması. Bu müzakirənin qalan hissəsi demək olar ki, yalnız serial alqoritmləri üzərində cəmləşir və ardıcıl işləməyi öz üzərinə götürür.
  • Uyğunlaşma: Girişin təyin olunmuşluğunun işləmə müddətinə təsir edib etməməsi. Bunu nəzərə alan alqoritmlərin adaptiv olduğu bilinir.
  • Onlayn: İnternetdə yerləşdirmə Sortlaşdırma kimi bir alqoritm sabit bir giriş axını sıralaya bilər.

Sabitlik Redaktə edin

Sabit çeşidləmə alqoritmləri təkrarlanan elementləri girişdə göründüyü qaydada sıralayır. Bəzi məlumat növlərini çeşidləyərkən, sıralama qaydasını təyin edərkən məlumatların yalnız bir hissəsi araşdırılır. Məsələn, sağdakı kart çeşidləmə nümunəsində kartlar dərəcələrinə görə sıralanır və kostyumlarına məhəl qoyulmur. Bu, orijinal siyahının bir neçə fərqli düzgün sıralanmış versiyasının mümkünlüyünə imkan verir. Sabit çeşidləmə alqoritmləri aşağıdakı qaydaya əsasən bunlardan birini seçir: iki maddə, iki 5 kart kimi bərabər müqayisə edərsə, nisbi qaydaları qorunub saxlanacaq, belə ki, biri girişdə bir-birindən qabağa gəlsə, bu da Çıxışda digərindən əvvəl gəlin.

Sabitlik aşağıdakı səbəbdən vacibdir: deyin ki, ad və sinif bölməsindən ibarət tələbə qeydləri bir veb səhifədə dinamik olaraq əvvəlcə ad, sonra sinif bölməsi üzrə ikinci əməliyyatda sıralanır. Hər iki halda da sabit bir çeşidləmə alqoritmi istifadə olunursa, sinif-bölmə əməliyyatı ad sırasını qeyri-sabit bir çeşidlə dəyişdirməz, ola bilər bölmə ilə çeşidləmə ad sırasını qarışdırır. Sabit bir çeşiddən istifadə edərək, istifadəçilər əvvəlcə ad istifadə edərək çeşidləyərək bölmədən sonra yenidən sıralamaqla ad sırasının qorunub saxlanılması ilə bölməyə və sonra adlara görə sıralamağı seçə bilərlər. (Bəzi elektron cədvəl proqramları bu davranışa tabedir: adlara görə, sonra bölməyə görə şagirdlərin əlifba sırası ilə bölməsinə görə siyahısı verilir.)
Başqa bir səbəb: qeyri-sabit sort, qaçışdan işə eyni giriş üçün fərqli nəticə verə bilər. Bu cür davranış bəzi tətbiqetmələr üçün uyğun deyil, məsələn, server çıxış üçün səhifələmədən istifadə etdiyi və müştərinin tələb etdiyi hər yeni səhifə üçün yeni bir axtarış və sıralama həyata keçirdiyi müştəri-server tətbiqləri üçün.

Daha rəsmi olaraq, çeşidlənən məlumatlar bir qeyd və ya dəyərlər cədvəli kimi təmsil edilə bilər və məlumatların çeşidlənməsi üçün istifadə olunan hissəsinə açar. Kart nümunəsində kartlar bir qeyd (rütbə, kostyum) kimi təmsil olunur və əsas dərəcədir. Eyni düyməyə sahib iki qeyd R və S olduqda və R orijinal siyahıda S-dən əvvəl göründüyündə bir çeşidləmə alqoritmi sabitdir, onda R həmişə sıralanmış siyahıda S-dən əvvəl görünəcəkdir.

Bərabər elementlər, məsələn tam ədədlərlə və ya ümumiyyətlə, bütün elementin açarı olduğu hər hansı bir məlumat ayrılmaz olduqda, sabitlik problem deyil. Bütün düymələr fərqli olduqda stabillik də problem deyil.

Qeyri-sabit çeşidləmə alqoritmləri sabit olmaq üçün xüsusi tətbiq oluna bilər. Bunu etmənin bir yolu açar müqayisəni süni şəkildə genişləndirməkdir, belə ki, başqa bərabər düymələri olan iki obyekt arasındakı müqayisələrə bağlayıcı kimi orijinal giriş siyahısındakı girişlərin sırasından istifadə edərək qərar veriləcəkdir. Bu əmri xatırlamaq üçün əlavə vaxt və yer tələb oluna bilər.

Sabit çeşidləmə alqoritmləri üçün bir tətbiq, birincil və ikincil düymədən istifadə edərək siyahını sıralamaqdır. Məsələn, kartların əlini kostyumların sifariş klublarında (♣), brilyantlarda (♦), ürəklərdə (♥), küreklərdə (♠) olmasını istədiyimizi və hər kostyumun içərisində kartların sıralanmasını istədiyimizi düşünək. rütbə. Bu, əvvəlcə kartları dərəcəyə görə sıralamaqla (hər növdən istifadə etməklə) və sonra kostyuma görə sabit bir sıralama ilə edilə bilər:

Hər bir kostyumun içərisində sabit sort, əvvəlcədən edilmiş dərəcəyə görə sifarişləri qoruyur. Bu fikir istənilən sayda düyməyə qədər genişləndirilə bilər və radix sortu ilə istifadə olunur. Eyni təsiri qeyri-sabit bir çeşidlə bir leksikoqrafik açar müqayisədən istifadə etməklə əldə etmək olar, məsələn, əvvəlcə kostyumla müqayisə edir, sonra kostyumlar eynidirsə dərəcə ilə müqayisə edir.

Bu cədvəldə, n sıralanacaq qeydlərin sayıdır. "Orta" və "Ən pis" sütunları, hər bir düymənin uzunluğunun sabit olduğu və bu səbəblə bütün müqayisələrin, svopların və digər lazımi əməliyyatların davamlı müddətdə davam edə biləcəyi fərziyyəsi ilə hər vəziyyətdə zamanın mürəkkəbliyini verir. "Yaddaş", eyni fərziyyəyə əsasən, siyahının özü tərəfindən istifadə ediləndən daha çox köməkçi saxlama miqdarını ifadə edir. Aşağıda sadalanan işləmə müddətləri və yaddaş tələblərinin böyük O qeydinin içərisində olduğu başa düşülməlidir, bu səbəbdən loqarifmlərin əsası qeyd qeydinin heç bir əhəmiyyəti yoxdur 2 n deməkdir (log n) 2 .

Müqayisə növləri Düzəliş et

Aşağıda müqayisə növlərinin cədvəli verilmişdir. Bir müqayisə növü daha yaxşı göstərə bilməz O(n giriş n) orta hesabla. [4]

Müqayisə növləri
Ad Ən yaxşısı Orta Ən pis Yaddaş Stabil Metod Digər qeydlər
Quicksort n giriş ⁡ n n qeyd. n n 2 < displaystyle n ^ <2>> giriş Yox Bölmə Quicksort ümumiyyətlə yerində edilir O(giriş n) yığın boşluğu. [5] [6]
Sıralama birləşdirin n qeyd. n n qeyd. n n giriş ⁡ n n Bəli Birləşir Çox paralelləşə bilər (qədər O(giriş n) Üç Macar Alqoritmindən istifadə edərək). [7]
Yerdə birləşmə növü n log 2 ⁡ n < displaystyle n log ^ <2> n> 1 Bəli Birləşir Sabit yerlərdə birləşməyə əsaslanan sabit bir növ kimi həyata keçirilə bilər. [8]
İntrosort n qeyd. n n qeyd. n n giriş ⁡ n giriş Yox Bölmə və amp seçimi Bir neçə STL tətbiqində istifadə olunur.
Heapsort n qeyd. n n giriş ⁡ n n qeyd. n 1 Yox Seçim
Yerləşdirmə növü n n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> 1 Bəli Yerləşdirmə O(n + d), ən pis vəziyyətdə olan ardıcıllıqlar üzərində d inversiyalar.
Blok sortu n n qeyd. n n qeyd. n 1 Bəli Yerləşdirmə və birləşdirmə Blok əsaslı O (n) < displaystyle O (n)> yerində birləşmə alqoritmini [9] aşağıdan yuxarıya birləşmə növü ilə birləşdirin.
Quadsort n n giriş ⁡ n n qeyd. n n Bəli Birləşir 4 girişli çeşidləmə şəbəkəsindən istifadə edir. [10]
Timsort n n qeyd. n n giriş ⁡ n n Bəli Yerləşdirmə və birləşdirmə Edir n məlumatlar artıq çeşidləndikdə və ya tərs çeşidləndikdə müqayisələr.
Seçim növü n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> 1 Yox Seçim O (n) < displaystyle O (n)> əlavə yerlə və ya əlaqəli siyahılardan istifadə edildikdə sabitdir. [11]
Cubesort n n qeyd. n n qeyd. n n Bəli Yerləşdirmə Edir n məlumatlar artıq çeşidləndikdə və ya tərs çeşidləndikdə müqayisələr.
Shellsort n qeyd. n n 4/3 < displaystyle n ^ <4/3 >> n 3/2 < displaystyle n ^ <3/2 >> 1 Yox Yerləşdirmə Kiçik kod ölçüsü.
Bubble sort n n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> 1 Bəli Mübadilə olunur Kiçik kod ölçüsü.
Ağac növü n qeyd. n n qeyd. n n log ⁡ n < displaystyle n log n> (balanslı) n Bəli Yerləşdirmə Özünü tarazlayan ikili axtarış ağacından istifadə edərkən.
Cycle sort n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> 1 Yox Seçim Nəzəri cəhətdən optimal yazı sayı ilə yerində.
Kitabxana növü n qeyd. n n qeyd. n n 2 < displaystyle n ^ <2>> n Yox Yerləşdirmə Boşluq əlavə etmə növünə bənzəyir. Giriş ehtimalı yüksək olan zaman həddini təmin etmək üçün girişin təsadüfi bir şəkildə dəyişdirilməsini tələb edir ki, bu da onu sabitləşdirmir.
Səbir çeşidlənməsi n n qeyd. n n giriş ⁡ n n Yox Yerləşdirmə və amp seçimi Bütün ən uzun artan ardıcıllıqları tapır O(n giriş n) .
Smoothsort n n qeyd. n n qeyd. n 1 Yox Seçim Ənənəvi ikili yığın əvəzinə, Leonardo ardıcıllığına əsaslanan bir yığma uyğunlaşma variantı.
Strand sort n n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> n Bəli Seçim
Turnir növü n qeyd. n n qeyd. n n qeyd. n n [12] Yox Seçim Heap Sort-un dəyişməsi.
Kokteyl çalkalayıcı növü n n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> 1 Bəli Mübadilə olunur Siyahının sonunda kiçik dəyərlərlə yaxşı işləyən Bubblesort variantı
Daraq növü n qeyd. n n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> 1 Yox Mübadilə olunur Orta hesabla baloncuk növündən daha sürətli.
Gnome sort n n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> 1 Bəli Mübadilə olunur Kiçik kod ölçüsü.
Dəyişdirmə Sırala [13] n kn kn n Yox Dağıtım və birləşmə Heç bir mübadilə edilmir. Parametr k girişdəki entropiya ilə mütənasibdir. k = Sıralı və ya tərs sifariş edilmiş giriş üçün 1.
Franceschini metodu [14] n n qeyd. n n qeyd. n 1 Bəli ? Həyata keçirir O(n) məlumat hərəkət edir.
Tək - cüt n n 2 < displaystyle n ^ <2>> n 2 < displaystyle n ^ <2>> 1 Bəli Mübadilə olunur Paralel prosessorlarda asanlıqla işləyə bilər.
Dairə növü n qeyd. n n log 2 ⁡ n < displaystyle n log ^ <2> n> n log 2 ⁡ n < displaystyle n log ^ <2> n> 1 Yox Mübadilə olunur Müəyyən giriş növlərində ən yaxşısı.

Müqayisəsiz növlər Düzəliş edin

Aşağıdakı cədvəldə tam çeşidləmə alqoritmləri və müqayisə növləri olmayan digər çeşidləmə alqoritmləri təsvir edilmişdir. Beləliklə, bunlarla məhdudlaşmırlar Ω(n giriş n). [15] Aşağıdakı mürəkkəbliklər k ölçülü düymələr, rəqəm d ölçüsü və r sayları sıralanacaq sıra ilə n maddələrin sıralanacağını fərz edir. Onların bir çoxu açar ölçüsünün bütün girişlərin unikal açar dəyərlərə sahib olması üçün kifayət qədər böyük olduğu fərziyyəsinə əsaslanır və buna görə də n ≪ 2 k , burada ≪ "daha az" deməkdir. Vahid dəyəri təsadüfi girişli maşın modelində işləmə müddəti n ⋅ k d < displaystyle scriptstyle n cdot < frac olan alqoritmlər >>, məsələn radix sortu, hələ də Θ ilə mütənasib vaxt tələb edirn giriş n), çünki n 2 k d < displaystyle 2 ^ < frac-dən çox olmamaqla məhdudlaşır >> və sıralamaq üçün daha çox sayda elementi yaddaşda saxlamaq üçün daha böyük bir k tələb etməlidir. [16]

Həm də tam olmayan ədədi çeşidləyə bilməz

Çox paylama növündən fərqli olaraq, bu, üzən nöqtə nömrələrini, mənfi nömrələri və daha çoxunu sıralaya bilər.

LSD variantı ilə eyni, tam olmayan ədədi sıralaya bilər.

Nümunələrortu, müqayisəli olmayan növlərdən hər hansı birini paralelləşdirmək üçün, məlumatları səmərəli şəkildə bir neçə vedrəyə paylayaraq və daha sonra bir neçə prosessora ayırma yolu ilə ötürmək üçün istifadə edilə bilər, çünki vedrələr bir-birləri arasında artıq sıralanmışdır.

Digərləri redaktə edin

Bəzi alqoritmlər yuxarıda müzakirə edilənlərlə müqayisədə yavaşdır, məsələn, sərhədsiz işləmə vaxtı olan bogosort və işləyən durma növü O(n 2.7) işləmə müddəti. Alqoritmlərin işləmə müddətinin necə qiymətləndirildiyini göstərmək üçün bu növlər ümumiyyətlə təhsil məqsədləri üçün təsvir olunur. Aşağıdakı cədvəldə olduqca zəif performans və ya xüsusi avadanlıq tələblərinə görə ənənəvi proqram kontekstlərində real həyatda istifadə üçün praktik olmayan bəzi çeşidləmə alqoritmləri təsvir edilmişdir.

Ad Ən yaxşısı Orta Ən pis Yaddaş Stabil Müqayisə Digər qeydlər
Muncuq sortu n S S n 2 < displaystyle n ^ <2>> Yoxdur Yox Yalnız müsbət tam ədədlərlə işləyir. Zəmanətli O (n) < displaystyle O (n)> vaxtında işləməsi üçün xüsusi avadanlıq tələb edir. Proqramın tətbiqi üçün bir ehtimal var, ancaq işləmə müddəti O (S) < displaystyle O (S)> olacaqdır, burada S sıralanacaq bütün tamların cəmidir, kiçik tam ədədlər halında xətti sayıla bilər.
Sadə pancake sortu n n giriş Yox Bəli Count sayğac sayıdır.
Spagetti (Anket) növü n n n n 2 < displaystyle n ^ <2>> Bəli Seçki Bu, tələb olunan maddələrin ardıcıllığını çeşidləmək üçün xətti, analoq bir alqoritmdir O(n) yığın boşluğu və sort sabitdir. Bu tələb edir n paralel prosessorlar. Spagetti sort # Analizinə baxın.
Şəbəkə çeşidlənir log 2 ⁡ n < displaystyle log ^ <2> n> log 2 ⁡ n < displaystyle log ^ <2> n> log 2 ⁡ n < displaystyle log ^ <2> n> n log 2 ⁡ n < displaystyle n log ^ <2> n> Fərqlidir (sabit çeşidləmə şəbəkələri daha çox müqayisə tələb edir) Bəli Müqayisələrin qaydası sabit bir şəbəkə ölçüsünə əsasən əvvəlcədən təyin olunur. 32-dən çox məhsul üçün praktik deyil. [ mübahisəli - müzakirə ]
Bitonik sıralayıcı log 2 ⁡ n < displaystyle log ^ <2> n> log 2 ⁡ n < displaystyle log ^ <2> n> log 2 ⁡ n < displaystyle log ^ <2> n> n log 2 ⁡ n < displaystyle n log ^ <2> n> Yox Bəli Sortlaşdırma şəbəkələrinin təsirli bir dəyişməsi.
Bogosort n (n × n!) sərhədsiz (müəyyən), (n × n!) < displaystyle (n dəfə n!)> (gözlənilən) 1 Yox Bəli Təsadüfi qarışdırmaq. Gözlənilən ən yaxşı iş müddəti də dəhşətli olduğu üçün yalnız misal üçün istifadə olunur. [20]
Stooge sort n log ⁡ 3 / log ⁡ 1.5 < displaystyle n ^ < log 3 / log 1.5 >> n log ⁡ 3 / log ⁡ 1.5 < displaystyle n ^ < log 3 / log 1.5 >> n log ⁡ 3 / log ⁡ 1.5 < displaystyle n ^ < log 3 / log 1.5 >> n Yox Bəli Zaman mürəkkəbliyi ilə çeşidləmə alqoritmlərinin çoxundan (sadəlövh olanlardan da) daha yavaşdır O(n log 3 / log 1.5) = O(n 2.7095. ) .
Slowsort n log ⁡ n < displaystyle n ^ < log n >> n log ⁡ n < displaystyle n ^ < log n >> n log ⁡ n < displaystyle n ^ < log n >> n Yox Bəli

Nəzəri kompüter alimləri, daha yaxşı təmin edən digər çeşidləmə alqoritmlərini təfərrüatlı izah etdilər O(n giriş n) əlavə məhdudiyyətlər qəbul edən zaman mürəkkəbliyi,

  • Thorupun alqoritmi, sonlu ölçülü bir alandan açarları çeşidləmək üçün təsadüfi bir alqoritm O(n log log n) vaxt və O(n) yer. [21]
  • O (n log ⁡ log ⁡ n) < displaystyle O sol (n < sqrt < log log n >> right)> gözlənilən vaxt və götürən təsadüfi bir tam çeşidləmə alqoritmi O(n) yer. [22]

Çox sayda çeşidləmə alqoritmi olduğu halda, praktik tətbiqlərdə bir neçə alqoritm üstünlük təşkil edir. Insertion sort kiçik məlumat dəstləri üçün geniş istifadə olunur, böyük data setlər üçün asimptotically səmərəli bir sort istifadə olunur, ilk növbədə yığın sort, birləşmə sort və ya quissort. Səmərəli tətbiqetmələr ümumiyyətlə hibrid bir alqoritmdən istifadə edir, ümumi sort üçün asimptotik cəhətdən səmərəli bir alqoritmi bir təkrarın altındakı kiçik siyahılar üçün əlavə sortu ilə birləşdirir. Yüksək tənzimlənmiş tətbiqetmələr Android, Java və Python-da istifadə olunan Timsort (birləşdirmə növü, əlavə etmə növü və əlavə məntiq) və bəzi C ++ dilində istifadə olunan (variant şəklində) introsort (quicksort və yığın növü) kimi daha inkişaf etmiş variantlardan istifadə edir. tətbiqləri və .NET-də sıralayın.

Sabit bir intervaldakı nömrələr kimi daha məhdud məlumatlar üçün, sayma sortu və ya radix sortu kimi paylama növləri geniş istifadə olunur. Baloncuk sortu və variantları praktikada nadir hallarda istifadə olunur, lakin tədris və nəzəri müzakirələrdə çox rast gəlinir.

Cisimləri fiziki cəhətdən çeşidləyərkən (məsələn, sənədlər, testlər və ya kitablar əlifba sıralaması) insanlar intuitiv olaraq ümumiyyətlə kiçik dəstlər üçün yerləşdirmə növlərindən istifadə edirlər. Daha böyük dəstlər üçün insanlar tez-tez ilk hərf kimi ilk vedrə və birdən çox çömçə çox böyük dəstlərin praktik olaraq çeşidlənməsinə imkan verir. Tez-tez yer, məsələn, cisimlərin yerə və ya geniş bir əraziyə yayılması kimi nisbətən ucuzdur, lakin əməliyyatlar baha başa gəlir, xüsusən də bir cismi böyük məsafəyə aparır - istinad yeri vacibdir. Birləşdirmə növləri fiziki obyektlər üçün də praktikdir, xüsusən hər əlin birləşdirilməsi üçün iki əl istifadə edilə biləcəyi üçün digər alqoritmlər, məsələn yığın sıralaması və ya sürətli sort, insan istifadəsi üçün çox uyğun deyil. Digər alqoritmlər, məsələn, boşluqlar qoyan əlavə etmə növünün bir variantı olan kitabxana növü, fiziki istifadə üçün də praktikdir.

Sadə növlər Redaktə edin

Ən sadə növlərdən ikisi daxilolma növü və seçim növüdür, hər ikisi də kiçik xərclərdə səmərəli, lakin böyük məlumatlarda təsirli deyil. Az sayda müqayisə və demək olar ki, çeşidlənmiş məlumatlarda yaxşı performans səbəbindən tətbiq sıralaması ümumiyyətlə praktikada seçim növündən daha sürətli olur və beləliklə praktikada üstünlük verilir, lakin seçim sıralamasında daha az yazı istifadə olunur və bu səbəbdən yazma performansı məhdudlaşdıran bir faktordur.

Insertion sort Edit

Yerləşdirmə növü kiçik siyahılar və əsasən sıralanmış siyahılar üçün nisbətən səmərəli olan və daha mürəkkəb alqoritmlərin bir hissəsi kimi istifadə olunan sadə bir çeşidləmə alqoritmidir. Siyahıdakı elementləri bir-bir götürərək düzgün mövqelərinə cüzdanımıza pul qoymağımıza bənzər yeni bir sıralanmış siyahıya əlavə etməklə işləyir. [23] Massivlərdə yeni siyahı və qalan elementlər massivin məkanını paylaşa bilər, lakin yerləşdirmə bahalıdır və aşağıdakı elementlərin hamısının bir-bir dəyişdirilməsini tələb edir. Shellsort (aşağıya bax) daha geniş siyahılar üçün daha təsirli olan əlavə növünün bir variantıdır.

Seçim növü Düzenle

Seçim növü yerində müqayisə növüdür. O var (n 2) mürəkkəblik, onu böyük siyahılarda təsirsiz hala gətirir və ümumiyyətlə oxşar yerləşdirmə növündən daha pis nəticə verir. Seçim növü sadəliyi ilə qeyd olunur və müəyyən vəziyyətlərdə daha mürəkkəb alqoritmlərə nisbətən performans üstünlüklərinə malikdir.

Alqoritm minimum dəyəri tapır, birinci mövqedəki dəyəri ilə dəyişdirir və siyahının qalan hissəsi üçün bu addımları təkrarlayır. [24] Bundan çox deyil n swaps, and thus is useful where swapping is very expensive.

Efficient sorts Edit

Practical general sorting algorithms are almost always based on an algorithm with average time complexity (and generally worst-case complexity) O(n log n), of which the most common are heap sort, merge sort, and quicksort. Each has advantages and drawbacks, with the most significant being that simple implementation of merge sort uses O(n) additional space, and simple implementation of quicksort has O(n 2 ) worst-case complexity. These problems can be solved or ameliorated at the cost of a more complex algorithm.

While these algorithms are asymptotically efficient on random data, for practical efficiency on real-world data various modifications are used. First, the overhead of these algorithms becomes significant on smaller data, so often a hybrid algorithm is used, commonly switching to insertion sort once the data is small enough. Second, the algorithms often perform poorly on already sorted data or almost sorted data – these are common in real-world data, and can be sorted in O(n) time by appropriate algorithms. Finally, they may also be unstable, and stability is often a desirable property in a sort. Thus more sophisticated algorithms are often employed, such as Timsort (based on merge sort) or introsort (based on quicksort, falling back to heap sort).

Merge sort Edit

Merge sort takes advantage of the ease of merging already sorted lists into a new sorted list. It starts by comparing every two elements (i.e., 1 with 2, then 3 with 4. ) and swapping them if the first should come after the second. It then merges each of the resulting lists of two into lists of four, then merges those lists of four, and so on until at last two lists are merged into the final sorted list. [25] Of the algorithms described here, this is the first that scales well to very large lists, because its worst-case running time is O(n log n). It is also easily applied to lists, not only arrays, as it only requires sequential access, not random access. However, it has additional O(n) space complexity, and involves a large number of copies in simple implementations.

Merge sort has seen a relatively recent surge in popularity for practical implementations, due to its use in the sophisticated algorithm Timsort, which is used for the standard sort routine in the programming languages Python [26] and Java (as of JDK7 [27] ). Merge sort itself is the standard routine in Perl, [28] among others, and has been used in Java at least since 2000 in JDK1.3. [29]

Heapsort Edit

Heapsort is a much more efficient version of selection sort. It also works by determining the largest (or smallest) element of the list, placing that at the end (or beginning) of the list, then continuing with the rest of the list, but accomplishes this task efficiently by using a data structure called a heap, a special type of binary tree. [30] Once the data list has been made into a heap, the root node is guaranteed to be the largest (or smallest) element. When it is removed and placed at the end of the list, the heap is rearranged so the largest element remaining moves to the root. Using the heap, finding the next largest element takes O(log n) time, instead of O(n) for a linear scan as in simple selection sort. This allows Heapsort to run in O(n log n) time, and this is also the worst case complexity.

Quicksort Edit

Quicksort is a divide and conquer algorithm which relies on a partition operation: to partition an array, an element called a pivot is selected. [31] [32] All elements smaller than the pivot are moved before it and all greater elements are moved after it. This can be done efficiently in linear time and in-place. The lesser and greater sublists are then recursively sorted. This yields average time complexity of O(n log n), with low overhead, and thus this is a popular algorithm. Efficient implementations of quicksort (with in-place partitioning) are typically unstable sorts and somewhat complex, but are among the fastest sorting algorithms in practice. Together with its modest O(log n) space usage, quicksort is one of the most popular sorting algorithms and is available in many standard programming libraries.

The important caveat about quicksort is that its worst-case performance is O(n 2 ) while this is rare, in naive implementations (choosing the first or last element as pivot) this occurs for sorted data, which is a common case. The most complex issue in quicksort is thus choosing a good pivot element, as consistently poor choices of pivots can result in drastically slower O(n 2 ) performance, but good choice of pivots yields O(n log n) performance, which is asymptotically optimal. For example, if at each step the median is chosen as the pivot then the algorithm works in O(n log n). Finding the median, such as by the median of medians selection algorithm is however an O(n) operation on unsorted lists and therefore exacts significant overhead with sorting. In practice choosing a random pivot almost certainly yields O(n log n) performance.

Shellsort Edit

The worst-case time complexity of Shellsort is an open problem and depends on the gap sequence used, with known complexities ranging from O(n 2 ) to O(n 4/3 ) and Θ(n giriş 2 n). This, combined with the fact that Shellsort is in-place, only needs a relatively small amount of code, and does not require use of the call stack, makes it is useful in situations where memory is at a premium, such as in embedded systems and operating system kernels.

Bubble sort and variants Edit

Bubble sort, and variants such as the shell sort and cocktail sort, are simple, highly inefficient sorting algorithms. They are frequently seen in introductory texts due to ease of analysis, but they are rarely used in practice.

Bubble sort Edit

Bubble sort is a simple sorting algorithm. The algorithm starts at the beginning of the data set. It compares the first two elements, and if the first is greater than the second, it swaps them. It continues doing this for each pair of adjacent elements to the end of the data set. It then starts again with the first two elements, repeating until no swaps have occurred on the last pass. [34] This algorithm's average time and worst-case performance is O(n 2 ), so it is rarely used to sort large, unordered data sets. Bubble sort can be used to sort a small number of items (where its asymptotic inefficiency is not a high penalty). Bubble sort can also be used efficiently on a list of any length that is nearly sorted (that is, the elements are not significantly out of place). For example, if any number of elements are out of place by only one position (e.g. 0123546789 and 1032547698), bubble sort's exchange will get them in order on the first pass, the second pass will find all elements in order, so the sort will take only 2n time.

Comb sort Edit

Comb sort is a relatively simple sorting algorithm based on bubble sort and originally designed by Włodzimierz Dobosiewicz in 1980. [36] It was later rediscovered and popularized by Stephen Lacey and Richard Box with a Byte Magazine article published in April 1991. The basic idea is to eliminate turtles, or small values near the end of the list, since in a bubble sort these slow the sorting down tremendously. (Rabbits, large values around the beginning of the list, do not pose a problem in bubble sort) It accomplishes this by initially swapping elements that are a certain distance from one another in the array, rather than only swapping elements if they are adjacent to one another, and then shrinking the chosen distance until it is operating as a normal bubble sort. Thus, if Shellsort can be thought of as a generalized version of insertion sort that swaps elements spaced a certain distance away from one another, comb sort can be thought of as the same generalization applied to bubble sort.

Distribution sort Edit

Distribution sort refers to any sorting algorithm where data is distributed from their input to multiple intermediate structures which are then gathered and placed on the output. For example, both bucket sort and flashsort are distribution based sorting algorithms. Distribution sorting algorithms can be used on a single processor, or they can be a distributed algorithm, where individual subsets are separately sorted on different processors, then combined. This allows external sorting of data too large to fit into a single computer's memory.

Counting sort Edit

Counting sort is applicable when each input is known to belong to a particular set, S, of possibilities. The algorithm runs in O(|S| + n) time and O(|S|) memory where n is the length of the input. It works by creating an integer array of size |S| and using the mənth bin to count the occurrences of the mənth member of S in the input. Each input is then counted by incrementing the value of its corresponding bin. Afterward, the counting array is looped through to arrange all of the inputs in order. This sorting algorithm often cannot be used because S needs to be reasonably small for the algorithm to be efficient, but it is extremely fast and demonstrates great asymptotic behavior as n artır. It also can be modified to provide stable behavior.

Bucket sort Edit

Bucket sort is a divide and conquer sorting algorithm that generalizes counting sort by partitioning an array into a finite number of buckets. Each bucket is then sorted individually, either using a different sorting algorithm, or by recursively applying the bucket sorting algorithm.

A bucket sort works best when the elements of the data set are evenly distributed across all buckets.

Radix sort Edit

Radix sort is an algorithm that sorts numbers by processing individual digits. n numbers consisting of k digits each are sorted in O(n · k) vaxt. Radix sort can process digits of each number either starting from the least significant digit (LSD) or starting from the most significant digit (MSD). The LSD algorithm first sorts the list by the least significant digit while preserving their relative order using a stable sort. Then it sorts them by the next digit, and so on from the least significant to the most significant, ending up with a sorted list. While the LSD radix sort requires the use of a stable sort, the MSD radix sort algorithm does not (unless stable sorting is desired). In-place MSD radix sort is not stable. It is common for the counting sort algorithm to be used internally by the radix sort. A hybrid sorting approach, such as using insertion sort for small bins, improves performance of radix sort significantly.

When the size of the array to be sorted approaches or exceeds the available primary memory, so that (much slower) disk or swap space must be employed, the memory usage pattern of a sorting algorithm becomes important, and an algorithm that might have been fairly efficient when the array fit easily in RAM may become impractical. In this scenario, the total number of comparisons becomes (relatively) less important, and the number of times sections of memory must be copied or swapped to and from the disk can dominate the performance characteristics of an algorithm. Thus, the number of passes and the localization of comparisons can be more important than the raw number of comparisons, since comparisons of nearby elements to one another happen at system bus speed (or, with caching, even at CPU speed), which, compared to disk speed, is virtually instantaneous.

For example, the popular recursive quicksort algorithm provides quite reasonable performance with adequate RAM, but due to the recursive way that it copies portions of the array it becomes much less practical when the array does not fit in RAM, because it may cause a number of slow copy or move operations to and from disk. In that scenario, another algorithm may be preferable even if it requires more total comparisons.

One way to work around this problem, which works well when complex records (such as in a relational database) are being sorted by a relatively small key field, is to create an index into the array and then sort the index, rather than the entire array. (A sorted version of the entire array can then be produced with one pass, reading from the index, but often even that is unnecessary, as having the sorted index is adequate.) Because the index is much smaller than the entire array, it may fit easily in memory where the entire array would not, effectively eliminating the disk-swapping problem. This procedure is sometimes called "tag sort". [37]

Another technique for overcoming the memory-size problem is using external sorting, for example one of the ways is to combine two algorithms in a way that takes advantage of the strength of each to improve overall performance. For instance, the array might be subdivided into chunks of a size that will fit in RAM, the contents of each chunk sorted using an efficient algorithm (such as quicksort), and the results merged using a k-way merge similar to that used in mergesort. This is faster than performing either mergesort or quicksort over the entire list. [38] [39]

Techniques can also be combined. For sorting very large sets of data that vastly exceed system memory, even the index may need to be sorted using an algorithm or combination of algorithms designed to perform reasonably with virtual memory, i.e., to reduce the amount of swapping required.

Related problems include partial sorting (sorting only the k smallest elements of a list, or alternatively computing the k smallest elements, but unordered) and selection (computing the kth smallest element). These can be solved inefficiently by a total sort, but more efficient algorithms exist, often derived by generalizing a sorting algorithm. The most notable example is quickselect, which is related to quicksort. Conversely, some sorting algorithms can be derived by repeated application of a selection algorithm quicksort and quickselect can be seen as the same pivoting move, differing only in whether one recurses on both sides (quicksort, divide and conquer) or one side (quickselect, decrease and conquer).

A kind of opposite of a sorting algorithm is a shuffling algorithm. These are fundamentally different because they require a source of random numbers. Shuffling can also be implemented by a sorting algorithm, namely by a random sort: assigning a random number to each element of the list and then sorting based on the random numbers. This is generally not done in practice, however, and there is a well-known simple and efficient algorithm for shuffling: the Fisher–Yates shuffle.


Order by column is sorting String like though it is an Integer column - Geographic Information Systems

In some cases, MySQL may use an index to satisfy an ORDER BY clause and avoid the extra sorting involved in performing a filesort operation.

The index may also be used even if the ORDER BY does not match the index exactly, as long as all unused portions of the index and all extra ORDER BY columns are constants in the WHERE clause. If the index does not contain all columns accessed by the query, the index is used only if index access is cheaper than other access methods.

Assuming that there is an index on ( key_part1 , key_part2 ) , the following queries may use the index to resolve the ORDER BY part. Whether the optimizer actually does so depends on whether reading the index is more efficient than a table scan if columns not in the index must also be read.

In this query, the index on ( key_part1 , key_part2 ) enables the optimizer to avoid sorting:

However, the query uses SELECT * , which may select more columns than key_part1key_part2 . In that case, scanning an entire index and looking up table rows to find columns not in the index may be more expensive than scanning the table and sorting the results. If so, the optimizer probably does not use the index. If SELECT * selects only the index columns, the index is used and sorting avoided.

If t1 is an InnoDB table, the table primary key is implicitly part of the index, and the index can be used to resolve the ORDER BY for this query:

In this query, key_part1 is constant, so all rows accessed through the index are in key_part2 order, and an index on ( key_part1 , key_part2 ) avoids sorting if the WHERE clause is selective enough to make an index range scan cheaper than a table scan:

In the next two queries, whether the index is used is similar to the same queries without DESC shown previously:

Two columns in an ORDER BY can sort in the same direction (both ASC , or both DESC ) or in opposite directions (one ASC , one DESC ). A condition for index use is that the index must have the same homogeneity, but need not have the same actual direction.

If a query mixes ASC and DESC , the optimizer can use an index on the columns if the index also uses corresponding mixed ascending and descending columns:

The optimizer can use an index on ( key_part1 , key_part2 ) əgər key_part1 is descending and key_part2 is ascending. It can also use an index on those columns (with a backward scan) if key_part1 is ascending and key_part2 is descending. See Section 8.3.13, “Descending Indexes”.

In the next two queries, key_part1 is compared to a constant. The index is used if the WHERE clause is selective enough to make an index range scan cheaper than a table scan:

In the next query, the ORDER BY does not name key_part1 , but all rows selected have a constant key_part1 value, so the index can still be used:

In some cases, MySQL edə bilməz use indexes to resolve the ORDER BY , although it may still use indexes to find the rows that match the WHERE clause. Examples:

The query uses ORDER BY on different indexes:

The query uses ORDER BY on nonconsecutive parts of an index:

The index used to fetch the rows differs from the one used in the ORDER BY :

The query uses ORDER BY with an expression that includes terms other than the index column name:

The query joins many tables, and the columns in the ORDER BY are not all from the first nonconstant table that is used to retrieve rows. (This is the first table in the EXPLAIN output that does not have a const join type.)

The query has different ORDER BY and GROUP BY expressions.

There is an index on only a prefix of a column named in the ORDER BY clause. In this case, the index cannot be used to fully resolve the sort order. For example, if only the first 10 bytes of a CHAR(20) column are indexed, the index cannot distinguish values past the 10th byte and a filesort is needed.

The index does not store rows in order. For example, this is true for a HASH index in a MEMORY table.

Availability of an index for sorting may be affected by the use of column aliases. Suppose that the column t1.a is indexed. In this statement, the name of the column in the select list is a . It refers to t1.a , as does the reference to a in the ORDER BY , so the index on t1.a can be used:

In this statement, the name of the column in the select list is also a , but it is the alias name. It refers to ABS(a) , as does the reference to a in the ORDER BY , so the index on t1.a cannot be used:

In the following statement, the ORDER BY refers to a name that is not the name of a column in the select list. But there is a column in t1 named a , so the ORDER BY refers to t1.a and the index on t1.a can be used. (The resulting sort order may be completely different from the order for ABS(a) , of course.)

Previously (MySQL 5.7 and lower), GROUP BY sorted implicitly under certain conditions. In MySQL 8.0, that no longer occurs, so specifying ORDER BY NULL at the end to suppress implicit sorting (as was done previously) is no longer necessary. However, query results may differ from previous MySQL versions. To produce a given sort order, provide an ORDER BY clause.

Use of filesort to Satisfy ORDER BY

If an index cannot be used to satisfy an ORDER BY clause, MySQL performs a filesort operation that reads table rows and sorts them. A filesort constitutes an extra sorting phase in query execution.

To obtain memory for filesort operations, as of MySQL 8.0.12, the optimizer allocates memory buffers incrementally as needed, up to the size indicated by the sort_buffer_size system variable, rather than allocating a fixed amount of sort_buffer_size bytes up front, as was done prior to MySQL 8.0.12. This enables users to set sort_buffer_size to larger values to speed up larger sorts, without concern for excessive memory use for small sorts. (This benefit may not occur for multiple concurrent sorts on Windows, which has a weak multithreaded malloc .)

A filesort operation uses temporary disk files as necessary if the result set is too large to fit in memory. Some types of queries are particularly suited to completely in-memory filesort operations. For example, the optimizer can use filesort to efficiently handle in memory, without temporary files, the ORDER BY operation for queries (and subqueries) of the following form:

Such queries are common in web applications that display only a few rows from a larger result set. Examples:

Influencing ORDER BY Optimization

For slow ORDER BY queries for which filesort is not used, try lowering the max_length_for_sort_data system variable to a value that is appropriate to trigger a filesort . (A symptom of setting the value of this variable too high is a combination of high disk activity and low CPU activity.) This technique applies only before MySQL 8.0.20. As of 8.0.20, max_length_for_sort_data is deprecated due to optimizer changes that make it obsolete and of no effect.

To increase ORDER BY speed, check whether you can get MySQL to use indexes rather than an extra sorting phase. If this is not possible, try the following strategies:

Increase the sort_buffer_size variable value. Ideally, the value should be large enough for the entire result set to fit in the sort buffer (to avoid writes to disk and merge passes).

Take into account that the size of column values stored in the sort buffer is affected by the max_sort_length system variable value. For example, if tuples store values of long string columns and you increase the value of max_sort_length , the size of sort buffer tuples increases as well and may require you to increase sort_buffer_size .

To monitor the number of merge passes (to merge temporary files), check the Sort_merge_passes status variable.

Increase the read_rnd_buffer_size variable value so that more rows are read at a time.

Change the tmpdir system variable to point to a dedicated file system with large amounts of free space. The variable value can list several paths that are used in round-robin fashion you can use this feature to spread the load across several directories. Separate the paths by colon characters ( : ) on Unix and semicolon characters ( ) on Windows. The paths should name directories in file systems located on different physical disks, not different partitions on the same disk.

ORDER BY Execution Plan Information Available

With EXPLAIN (see Section 8.8.1, “Optimizing Queries with EXPLAIN”), you can check whether MySQL can use indexes to resolve an ORDER BY clause:

If the Extra column of EXPLAIN output does not contain Using filesort , the index is used and a filesort is not performed.

If the Extra column of EXPLAIN output contains Using filesort , the index is not used and a filesort is performed.

In addition, if a filesort is performed, optimizer trace output includes a filesort_summary block. For example:

peak_memory_used indicates the maximum memory used at any one time during the sort. This is a value up to but not necessarily as large as the value of the sort_buffer_size system variable. Prior to MySQL 8.0.12, the output shows sort_buffer_size instead, indicating the value of sort_buffer_size . (Prior to MySQL 8.0.12, the optimizer always allocates sort_buffer_size bytes for the sort buffer. As of 8.0.12, the optimizer allocates sort-buffer memory incrementally, beginning with a small amount and adding more as necessary, up to sort_buffer_size bytes.)

The sort_mode value provides information about the contents of tuples in the sort buffer:

<sort_key, rowid> : This indicates that sort buffer tuples are pairs that contain the sort key value and row ID of the original table row. Tuples are sorted by sort key value and the row ID is used to read the row from the table.

<sort_key, additional_fields> : This indicates that sort buffer tuples contain the sort key value and columns referenced by the query. Tuples are sorted by sort key value and column values are read directly from the tuple.

<sort_key, packed_additional_fields> : Like the previous variant, but the additional columns are packed tightly together instead of using a fixed-length encoding.

EXPLAIN does not distinguish whether the optimizer does or does not perform a filesort in memory. Use of an in-memory filesort can be seen in optimizer trace output. Look for filesort_priority_queue_optimization . For information about the optimizer trace, see MySQL Internals: Tracing the Optimizer.


A Simple Example

To illustrate a basic sorting operation, consider the table below which has two columns, CountryPopulation. The Country column is a text field (or label), whereas the Population column contains numeric data. The table on the left shows the original data which is not sorted in any particular order. The table on the right has been sorted by Population in descending order. In other words, the country with the highest population is sorted to the first row, followed by the country with the second-highest population, and so forth.

This allows the reader to easily understand the order of the countries, without needing to compare all of the numbers in the table.


Mündəricat

A sort command that invokes a general sort facility was first implemented within Multics. [1] Later, it appeared in Version 1 Unix. This version was originally written by Ken Thompson at AT&T Bell Laboratories. By Version 4 Thompson had modified it to use pipes, but sort retained an option to name the output file because it was used to sort a file in place. In Version 5, Thompson invented "-" to represent standard input. [2]

The version of sort bundled in GNU coreutils was written by Mike Haertel and Paul Eggert. [3] This implementation employs the merge sort algorithm.

With no FILE , or when FILE is - , the command reads from standard input.


Sorting for Humans : Natural Sort Order

The default sort functions in almost every programming language are poorly suited for human consumption. What do I mean by that? Well, consider the difference between sorting filenames in Windows explorer, and sorting those very same filenames via Array.Sort() code:

I can say without the slightest hint of exaggeration that this exact sorting problem has been a sore point on every single project I've ever worked on. Users will inevitably complain that their items aren't sorting properly, and file bugs on these "errors". Being card-carrying members of the homo logicus club, we programmers produce a weary sigh, and try to keep any obvious eye-rolling in check as we patiently inform our users that this isn't an error. Items var sorting in proper order. Proper ASCII order, that is. As we're walking away, hopefully you won't hear us mutter under our breath what we're actually thinking-- "Stupid users! They don't even understand how sorting works!"

I always felt a pang of regret when rejecting these requests. Honestly, look at those two lists-- what sane person would want ASCII order? It's a completely nonsensical ordering to anyone who doesn't have the ASCII chart committed to memory (and by the way, uppercase A is decimal 65). I never really understood that there was another way to sort, even though natural sort has been right in front of us all along in the form of Mac Finder and Windows Explorer file listings. I had language-induced blinders on. If our built-in sort returns in ASCII order, then that must be correct. It was bequeathed upon us by the Language Gods. Can there be any other way?

Kate Rhodes is a bit up in arms about our collective ignorance of ASCIIbetical vs. Alphabetical. Can't say I blame her. I'm as guilty as anyone. Turns out the users weren't the stupid ones after all -- I was.

It isn't called "Alphabetical sort" it's collectively known as natural sort. But she's right about one thing: it's hard to find information on natural sorting, and many programmers are completely ignorant of it. None of the common computer languages (that I know of) implement anything other than ASCIIbetical sorts. There are a few places you can find natural sort algorithms, however:

  • Dave Koelle's The Alphanum Algorithm
  • Martin Pool's Natural Order String Comparison
  • Ian Griffiths' Natural Sorting in C#
  • Ned Batchelder's Compact Python Human Sort, along with Jussi Salmela's internationalized version of same.

Don't let Ned's clever Python ten-liner fool you. Implementing a natural sort is more complex than it seems, and not just for the gnarly i18n issues I've hinted at, above. But the Python implementations are impressively succinct. One of Ned's commenters posted this version, which is even shorter:

I tried to come up with a clever, similarly succinct C# 3.0 natural sort implementation, but I failed. I'm not interested in a one-liner contest, necessarily, but it does seem to me that a basic natural sort shouldn't require the 40+ lines of code it takes in most languages.

As programmers, we'd do well to keep Kate's lesson in mind: ASCIIbetical does not equal alphabetical. ASCII sorting serves the needs of the computer and the compiler, but what about us human beings? Perhaps a more human-friendly natural sort option should be built into mainstream programming languages, too.


7 Cavablar 7

I know this is old, but thought it may be helpful for anyone reading this. If you want to clean up the code, you can always refactor it.. something like this is more readable than the original:

You can then refactor this further by moving these methods into a service class if you want to.

RED: I apologize from my earlier sample that didn't quite compile. I've fixed it and added a more complete example.

You could associate each condition with a strategy for changing the query. Each strategy (called SearchFieldMutator in this example) will hold two things:

The first part is a delegate (of type Predicate<TSearch> ) that returns true or false based on the data in the UserSearchViewModel (or any other type, since it only defines a generic type TSearch ). If it return true , the strategy is applied. If it returns false , it's not applied. This is the type of the delegate:

(it could also have been written as Func<TSearch, bool> )

The second part is the strategy itself. It is supposed to 'mutate' the query by applying a LINQ operator to it, but really just returns a new query with the added operator, and the caller of it should discard the old query and keep the new one. So it's not really mutation, but it has the same effect. I've created a new delegate type for it, so its usage is clear:

QEYD: I've defined both the item type and the search data as generic types (as TItem and TSearch , respectively) so this code is usable in multiple locations in your code. But if this is confusing, you can remove the generics completely, and replace any TItem with UserListItem and any TSearch with UserSearchViewModel .

Now that we have defined the two types of the strategy, we can create a class that holds them both, and also does the (simulated) mutation:

This class holds both the condition and the strategy itself, and by using the Apply() method, we can easily apply it to a query if the condition is met.

We can now go create out list of strategies. We'll define some place to hold them (on one of your classes), since they only have to be created once (they are stateless after all):

We'll then populate the list:

We can then try to run it on a query. Instead of an actual Entity Framework query, I'm going to use a simply array of UserListItem s and add a .ToQueryable() on to it. It will work the same if you replace it with an actual database query. I'm also going to create a simple search, for the sake of the example:

The following actually does all the work, it changes query inside the usersQuery variable to the one specified by all the search strategies:

That's it! This is the result of the query:

You can try running it yourself. Here's a LINQPad query for you to play around with:


Videoya baxın: Excelde iki sütunu birleştirme Formülü (Oktyabr 2021).