Învățați cum să utilizați funcția Python Sort pentru sortarea listelor, array-urilor, dicționarelor, etc. folosind diverse metode și algoritmi de sortare în Python:
Sortarea este o tehnică utilizată pentru sortarea datelor într-o ordine secvențială, fie în ordine crescătoare, fie în ordine descrescătoare.
De cele mai multe ori, datele din proiectele mari nu sunt aranjate în ordinea corectă, ceea ce creează probleme în timpul accesării și obținerii eficiente a datelor necesare.
Pentru a rezolva această problemă se folosesc tehnici de sortare. Python oferă diferite tehnici de sortare de exemplu, Sortare cu bule, sortare prin inserție, sortare prin fuziune, sortare rapidă, etc.
În acest tutorial, vom înțelege cum funcționează sortarea în Python folosind diverși algoritmi.
Python Sort
Sintaxa de sortare Python
Pentru a efectua sortarea, Python oferă o funcție încorporată, și anume funcția " sort() ". Aceasta este utilizată pentru a sorta elementele de date dintr-o listă în ordine crescătoare sau descrescătoare.
Să înțelegem acest concept cu un exemplu.
Exemplul 1:
``` a = [ 3, 5, 2, 6, 7, 9, 8, 1, 4 ] a.sort() print( " Lista în ordine crescătoare: ", a ) ```
Ieșire:
În acest exemplu, lista neordonată dată este sortată în ordine crescătoare cu ajutorul funcției " sort( ) ".
Exemplul 2:
``` a = [ 3, 5, 2, 6, 7, 9, 8, 1, 4 ] a.sort( reverse = True ) print( " Lista în ordine descrescătoare: ", a ) ```
Ieșire
În exemplul de mai sus, lista neordonată dată este sortată în ordine inversă cu ajutorul funcției " sort( reverse = True ) ".
Complexitatea temporală a algoritmilor de sortare
Complexitatea temporală este cantitatea de timp necesară calculatorului pentru a executa un anumit algoritm. Există trei tipuri de cazuri de complexitate temporală.
- În cel mai rău caz: Timpul maxim de execuție a programului de către computer.
- Caz mediu: Timpul necesar între minimul și maximul de execuție a programului de către calculator.
- Cel mai bun caz: Timpul minim necesar calculatorului pentru a executa programul. Este cel mai bun caz de complexitate a timpului.
Notații de complexitate
Big Oh Notation, O: Notația Big oh este modalitatea oficială de exprimare a limitei superioare a timpului de execuție a algoritmilor. Aceasta este utilizată pentru a măsura complexitatea timpului în cel mai rău caz sau, mai exact, cea mai mare cantitate de timp necesară pentru finalizarea algoritmului.
Omega mare Notație, : Notația Big Omega este modul oficial de a exprima cea mai mică limită a timpului de execuție a algoritmilor. Este utilizată pentru a măsura complexitatea timpului în cel mai bun caz sau, mai exact, pentru a măsura cantitatea excelentă de timp necesară algoritmului.
Notarea Theta, : Notația Theta este modalitatea oficială de exprimare a ambelor limite, adică a limitei inferioare și a limitei superioare a timpului necesar pentru finalizarea algoritmului.
Metode de sortare în Python
Sortare cu bule
Sortarea cu bule este cel mai simplu mod de sortare a datelor care utilizează tehnica forței brute. Aceasta va itera fiecare element de date și îl va compara cu alte elemente pentru a oferi utilizatorului datele sortate.
Să luăm un exemplu pentru a înțelege această tehnică:
- Avem la dispoziție un tablou cu elementele " 10, 40, 7, 3, 15 ". Acum, trebuie să aranjăm acest tablou într-o ordine crescătoare folosind tehnica de sortare Bubble sort în Python.
- Primul pas constă în aranjarea tabloului în ordinea dată.
- În "Iterarea 1", comparăm primul element al unui tablou cu celelalte elemente, unul câte unul.
- Săgețile roșii descriu compararea primelor elemente cu celelalte elemente ale unui tablou.
- Dacă observați că " 10 " este mai mic decât " 40 ", el rămâne pe același loc, dar următorul element " 7 " este mai mic decât " 10 ". Prin urmare, acesta este înlocuit și ajunge pe primul loc.
- Procesul de mai sus va fi efectuat din nou și din nou pentru a sorta elementele.
- În "Iterarea 2", al doilea element este comparat cu celelalte elemente ale unui tablou.
- Dacă elementul comparat este mic, atunci va fi înlocuit, altfel va rămâne în același loc.
- În "Iterarea 3", cel de-al treilea element este comparat cu celelalte elemente ale unui tablou.
- În ultima "Iterare 4", penultimul element este comparat cu celelalte elemente ale unui tablou.
- În această etapă, matricea este sortată în ordine crescătoare.
Program pentru sortare cu bule
``` def Bubble_Sort(unsorted_list): for i in range(0,len(unsorted_list)-1): for j in range(len(unsorted_list)-1): if(unsorted_list[j]>unsorted_list[j+1]): temp_storage = unsorted_list[j] unsorted_list[j] = unsorted_list[j+1] unsorted_list[j+1] unsorted_list[j+1] = temp_storage return unsorted_list unsorted_list unsorted_list = [5, 3, 8, 6, 6, 7, 2] print("Unsorted List: ", unsorted_list) print("Sorted List using Bubble SortTehnică: ", Bubble_Sort(unsorted_list)) ```
Ieșire
Complexitatea în timp a sortării Bubble
- În cel mai rău caz: Cea mai rea complexitate în timp pentru sortarea cu bule este O( n 2).
- Caz mediu: Complexitatea medie a timpului pentru sortarea cu bule este O( n 2).
- Cel mai bun caz: Cea mai bună complexitate în timp pentru sortarea cu bule este O(n).
Avantaje
- Este cel mai des utilizat și este ușor de implementat.
- Putem schimba elementele de date fără a consuma spațiu de stocare pe termen scurt.
- Necesită mai puțin spațiu.
Dezavantaje
- Nu a avut performanțe bune în cazul unui număr mare de elemente de date de mari dimensiuni.
- Este nevoie de n 2 etape pentru fiecare număr "n" de elemente de date care trebuie sortate.
- Nu este foarte bun pentru aplicațiile din lumea reală.
Sortare prin inserție
Sortarea prin inserție este o tehnică de sortare ușoară și simplă care funcționează similar cu sortarea cărților de joc. Sortarea prin inserție sortează elementele prin compararea fiecărui element unul câte unul cu celălalt. Elementele sunt selectate și schimbate cu celălalt element dacă elementul este mai mare sau mai mic decât celălalt.
Să luăm un exemplu
- Avem la dispoziție o matrice cu elementele " 100, 50, 30, 40, 10 ".
- În primul rând, aranjăm matricea și începem să o comparăm.
- În prima etapă, " 100 " este comparat cu cel de-al doilea element " 50 ". " 50 " este înlocuit cu " 100 ", deoarece este mai mare.
- În a doua etapă, al doilea element " 100 " este comparat cu al treilea element " 30 " și este înlocuit.
- Acum, dacă observați, " 30 " se află pe primul loc, deoarece este din nou mai mic decât " 50 ".
- Comparația va avea loc până la ultimul element al unui tablou, iar la sfârșit vom obține datele sortate.
Program de sortare a inserției
``` def InsertionSort(array): for i in range(1, len(array)): key_value = array[i] j = i-1 while j>= 0 and key_value <array[j] : array[j + 1] = array[j] j -= 1 array[j + 1] = key_value array = [11, 10, 12, 4, 5] print("Arhiva nesortată: ", array) InsertionSort(array) print ("Arhiva sortată folosind Insertion Sort: ") for i in range(len(array)): print (array[i]) ````
Ieșire
Complexitatea temporală a sortului de inserție
- În cel mai rău caz: Complexitatea în cel mai rău timp pentru sortarea prin inserție este O( n 2).
- Caz mediu: Complexitatea medie a timpului pentru sortarea prin inserție este O( n 2).
- Cel mai bun caz: Cea mai bună complexitate în timp pentru sortarea prin inserție este O(n).
Avantaje
- Este simplu și ușor de implementat.
- Se comportă bine atunci când se ocupă de un număr mic de elemente de date.
- Acesta nu are nevoie de mai mult spațiu pentru punerea sa în aplicare.
Dezavantaje
- Nu este util să sortați un număr mare de elemente de date.
- În comparație cu alte tehnici de sortare, aceasta nu are rezultate bune.
Sortare prin contopire
Această metodă de sortare utilizează metoda "divide și cucerește" pentru a sorta elementele într-o anumită ordine. În timpul sortării cu ajutorul sortării prin îmbinare, elementele sunt împărțite în jumătăți și apoi sunt sortate. După sortarea tuturor jumătăților, elementele sunt din nou unite pentru a forma o ordine perfectă.
Să luăm un exemplu pentru a înțelege această tehnică
- Avem la dispoziție un tablou " 7, 3, 40, 10, 20, 15, 6, 5 ". Tabloul conține 7 elemente. Dacă îl împărțim în două ( 0 + 7 / 2 = 3 ).
- În al doilea pas, veți vedea că elementele sunt împărțite în două părți, fiecare având câte 4 elemente.
- În continuare, elementele sunt din nou împărțite și au câte 2 elemente fiecare.
- Acest proces va continua până când într-un array va fi prezent un singur element. Consultați pasul nr. 4 din imagine.
- Acum, vom sorta elementele și vom începe să le unim așa cum am fost împărțiți.
- În pasul nr. 5, dacă observați că 7 este mai mare decât 3, atunci le vom schimba și le vom uni în pasul următor și invers.
- La sfârșit, veți observa că matricea noastră este sortată în ordine crescătoare.
Program pentru Merge sort
``` def MergeSort(arr): if len(arr)> 1: middle = len(arr)//2 L = arr[:middle] R = arr[middle:] MergeSort(L) MergeSort(R) i = j = k = 0 while i <len(L) and j <len(R): if L[i] <R[j]: arr[k] = L[i] i += 1 else: arr[k] = R[j] j += 1 k += 1 while i <len(L): arr[k] = L[i] i += 1 k += 1 while j <len(R): arr[k] = R[j] j += 1 k += 1 def PrintSortedList(arr): for i inrange(len(arr)): print(arr[i],) print() arr = [12, 11, 13, 5, 6, 7] print("Array dat este", end="\n") PrintSortedList(arr) MergeSort(arr) print("Array sortat este: ", end="\n") PrintSortedList(arr) ```
Ieșire
Complexitatea temporală a sortarei de fuziune
- În cel mai rău caz: Cea mai rea complexitate în timp pentru sortarea fuzionată este O( n log( n )).
- Caz mediu: Timpul mediu de complexitate pentru sortare fuzionată este O( n log( n )).
- Cel mai bun caz: Cea mai bună complexitate în timp pentru sortarea fuzionată este O( n log( n )).
Avantaje
- Dimensiunea fișierului nu contează pentru această tehnică de sortare.
- Această tehnică este bună pentru datele care sunt, în general, accesate într-o ordine succesivă. De exemplu, liste legate, unitate de bandă etc.
Dezavantaje
- Necesită mai mult spațiu în comparație cu alte tehnici de sortare.
- Este comparativ mai puțin eficient decât altele.
Sortare rapidă
Sortarea rapidă utilizează din nou metoda "divide et impera" pentru a sorta elementele unei liste sau ale unui tablou. Aceasta vizează elementele pivot și sortează elementele în funcție de elementul pivot selectat.
De exemplu
- Ni se pune la dispoziție un tablou cu elementele " 1,8,3,9,4,5,7 ".
- Să presupunem că " 7 " este un element pilot.
- Acum vom împărți matricea în așa fel încât partea stângă să conțină elementele care sunt mai mici decât elementul pivot " 7 ", iar partea dreaptă să conțină elementele mai mari decât elementul pivot " 7 ".
- Acum avem două tablouri " 1,3,4,5 " și " 8, 9 ".
- Din nou, trebuie să împărțim ambele tablouri la fel ca mai sus. Singura diferență este că elementele pivot se schimbă.
- Trebuie să împărțim array-urile până când obținem un singur element din array.
- La final, colectați toate elementele pivot într-o secvență de la stânga la dreapta și veți obține o matrice sortată.
Program pentru sortare rapidă
``` def Array_Partition( arr, lowest, highest ): i = ( lowest-1 ) pivot_element = arr[ highest ] for j in range( lowest, highest ): if arr[ j ] <= pivot_element: i = i+1 arr[ i ], arr[ j ] = arr[ j ], arr[ i ] arr[ i+1 ] arr[ i+1 ], arr[ highest ] = arr[ highest ], arr[ i+1 ] return ( i+1 ) def QuickSort( arr, lowest, highest ): if len( arr ) == 1: return arr if lowest <highest: pi = Array_Partition(arr, cel mai mic, cel mai mare ) QuickSort( arr, cel mai mic, pi-1 ) QuickSort( arr, pi+1, cel mai mare ) arr = [ 9, 6, 7, 7, 8, 0, 4 ] n = len( arr ) print( " Matricea nesortată: ", arr ) QuickSort( arr, 0, n-1 ) print( " Matricea sortată folosind Quick Sort: " ) for i in range( n ): print( " %d " % arr[ i ] ) ```
Ieșire
Complexitatea în timp a sortării rapide
- În cel mai rău caz: Cea mai rea complexitate de timp pentru Quick sort este O( n 2).
- Caz mediu: Complexitatea medie a timpului pentru sortarea rapidă este O( n log( n )).
- Cel mai bun caz: Cea mai bună complexitate de timp pentru Quick sort este O( n log( n )).
Avantaje
- Este cunoscut ca fiind cel mai bun algoritm de sortare din Python.
- Este utilă în timpul manipulării unei cantități mari de date.
- Nu necesită spațiu suplimentar.
Dezavantaje
- Complexitatea sa în cel mai rău caz este similară cu complexitatea sortării cu bule și a sortării prin inserție.
- Această metodă de sortare nu este utilă atunci când avem deja o listă sortată.
Sortare în grămadă
Sortarea în grămadă este versiunea avansată a arborelui de căutare binar. În sortarea în grămadă, cel mai mare element al unei matrice este plasat întotdeauna la rădăcina arborelui și apoi, comparat cu rădăcina cu nodurile de frunze.
De exemplu:
- Avem la dispoziție o matrice cu elementele " 40, 100, 30, 50, 10 ".
- În " pasul 1 " am realizat un arbore în funcție de prezența elementelor din matrice.
- În " pasul 2 " realizăm o grămadă maximă, adică să aranjăm elementele în ordine descrescătoare. Cel mai mare element va sta în partea de sus (rădăcină), iar cel mai mic element va sta în partea de jos (noduri de frunze). Matricea dată devine " 100, 50, 30, 30, 40, 10 ".
- În " pasul 3 " , realizăm grămada minimă astfel încât să putem găsi elementele minime ale unui tablou. Procedând astfel, obținem elementele maxime și minime.
- În " pasul 4 " efectuând aceiași pași, obținem tabloul sortat.
Program pentru Heap sort
``` def HeapSortify( arr, n, i ): larger_element = i left = 2 * i + 1 right = 2 * i + 2 if left <n and arr[ larger_element ] <arr[ left ]: larger_element = left if right <n and arr[ larger_element ] <arr[ right ]: larger_element = right if larger_element != i: arr[ i ], arr[ larger_element ] = arr[ larger_element ] = arr[ larger_element ], arr[ i ] HeapSortify( arr, n, larger_element ) def HeapSort( arr): n = len( arr ) for i in range( n//2 - 1, -1, -1 ): HeapSortify( arr, n, i ) for i in range( n-1, 0, -1 ): arr[ i ], arr[ 0 ] = arr[ 0 ], arr[ i ] HeapSortify( arr, i, 0 ) arr = [ 11, 10, 12, 4, 5, 6 ] print( " Arrayul nesortat este: ", arr ) HeapSort( arr ) n = len( arr ) print( " Arrayul sortat prin Heap Sort: " ) for i in range( n ): print( arr[ i ] ) ```
Ieșire
Complexitatea în timp a sortării Heap
- În cel mai rău caz: Cea mai rea complexitate în timp pentru sortarea Heap este O( n log( n )).
- Caz mediu: Complexitatea medie a timpului pentru sortarea Heap este O( n log( n )).
- Cel mai bun caz: Cea mai bună complexitate a timpului pentru sortarea Heap esteO( n log( n )).
Avantaje
- Acesta este utilizat în special datorită productivității sale.
- Acesta poate fi implementat ca un algoritm in-place.
- Nu necesită o depozitare mare.
Dezavantaje
- Are nevoie de spațiu pentru sortarea elementelor.
- Se face arborele pentru sortarea elementelor.
Comparație între tehnicile de sortare
Metoda de sortare | Complexitatea timpului în cel mai bun caz | Complexitatea medie a timpului pentru un caz | Complexitatea timpului în cel mai rău caz | Complexitatea spațială | Stabilitate | În - loc |
---|---|---|---|---|---|---|
Sortare cu bule | O(n) | O(n2) | O(n2) | O(1) | Da | Da |
Sortare prin inserție | O(n) | O(n2) | O(n2) | O(1) | Da | Da |
Sortare rapidă | O(n log(n)) | O(n log(n)) | O(n2) | O(N) | Nu | Da |
Sortare prin contopire | O(n log(n)) | O(n log(n)) | O(n log(n)) | O(N) | Da | Nu |
Sortare în grămadă | O(n log(n)) | O(n log(n)) | O(n log(n)) | O(1) | Nu | Da |
În tabelul comparativ de mai sus, " O " reprezintă notația Big Oh explicată mai sus, în timp ce " n " și " N " reprezintă dimensiunea datelor de intrare.
Întrebări frecvente
Î #1) Ce este sort () în Python?
Răspuns: În Python sort() este o funcție care este utilizată pentru a sorta listele sau array-urile într-o anumită ordine. Această funcție ușurează procesul de sortare atunci când se lucrează la proiecte mari. Este foarte utilă pentru dezvoltatori.
Î #2) Cum se face sortarea în Python?
Răspuns: Python oferă diverse tehnici de sortare care sunt utilizate pentru a sorta elementul. De exemplu, Sortare rapidă, sortare combinată, sortare cu bule, sortare prin inserție etc. Toate tehnicile de sortare sunt eficiente și ușor de înțeles.
Î #3) Cum funcționează Python sort ()?
Răspuns: Funcția sort() primește matricea dată ca intrare de la utilizator și o sortează într-o anumită ordine folosind algoritmul de sortare. Selectarea algoritmului depinde de alegerea utilizatorului. Utilizatorii pot folosi Quick sort, Merge sort, Bubble sort, Insertion sort, etc. în funcție de nevoile utilizatorului.
Concluzie
În tutorialul de mai sus, am discutat tehnica de sortare în Python împreună cu tehnicile generale de sortare.
- Sortare cu bule
- Sortare prin inserție
- Sortare rapidă
Am învățat despre complexitatea și avantajele și dezavantajele acestora, precum și despre avantajele și dezavantajele lor. De asemenea, am comparat toate tehnicile de mai sus.