Implementace třídicích algoritmů v Pythonu

Třídění je jednou z nejpoužívanějších funkcí v programování. A dokončení řazení bude nějakou dobu trvat, pokud jsme nepoužili správný algoritmus.

V tomto článku budeme diskutovat o různých třídicích algoritmech.

Provedeme vás různými třídicími algoritmy při každém kroku implementace. Implementační část bude v Pythonu. Jakmile získáte algoritmus, můžete jej snadno převést do jakéhokoli jazyka. To je otázka syntaxe jazyka.

V tomto tutoriálu uvidíme různé algoritmy od nejhoršího po nejlepší. Takže se nebojte. Postupujte podle článku a implementujte je.

Pojďme se ponořit do třídicích algoritmů.

Řazení vkládání

Vložení řazení je jedním z jednoduchých třídicích algoritmů. Je snadné to implementovat. A třídění pole vás bude stát více času. Nebude se ve většině případů používat pro řazení větších polí.

Algoritmus řazení vložení udržuje v daném poli seřazené a neseřazené podčásti.

Seřazená podčást obsahuje pouze první prvek na začátku procesu třídění. Vezmeme prvek z neseřazeného pole a umístíme je na správnou pozici v seřazeném podpole.

Podívejme se na vizuální ilustrace řazení vkládání krok za krokem s příkladem.

Podívejme se na kroky k implementaci řazení vložení.

  • Inicializujte pole pomocí fiktivních dat (celých čísel).
  • Iterujte dané pole z druhého prvku.
    • Vezměte aktuální pozici a prvek ve dvou proměnných.
    • Napište smyčku, která se opakuje, dokud se neobjeví první prvek pole nebo prvek, který je menší než aktuální prvek.
      • Aktualizujte aktuální prvek předchozím prvkem.
      • Snížení aktuální pozice.
    • Zde musí smyčka dosáhnout buď začátku pole, nebo najít menší prvek, než je aktuální prvek. Nahradit prvek aktuální polohy aktuálním prvkem.

Časová složitost řazení vložení je O(n^2) a prostorová složitost, pokud O(1).

A je to; seřadili jsme dané pole. Spusťte následující kód. Doufám, že jste nainstalovali Python, pokud ne, podívejte se na instalační příručku. Případně můžete použít online kompilátor Pythonu.

def insertion_sort(arr, n):
	for i in range(1, n):

		## current position and element
		current_position = i
		current_element = arr[i]

		## iteratin until
		### it reaches the first element or
		### the current element is smaller than the previous element
		while current_position > 0 and current_element <
		 arr[current_position - 1]:
			## updating the current element with previous element
			arr[current_position] = arr[current_position - 1]

			## moving to the previous position
			current_position -= 1

		## updating the current position element
		arr[current_position] = current_element

if __name__ == '__main__':
	## array initialization
	arr = [3, 4, 7, 8, 1, 9, 5, 2, 6]
	insertion_sort(arr, 9)

	## printing the array
	print(str(arr))

Výběr Seřadit

Řazení výběru je s malým rozdílem podobné řazení vložení. Tento algoritmus také rozděluje pole na seřazené a netříděné podčásti. A pak při každé iteraci vezmeme minimální prvek z neseřazené podčásti a umístíme jej na poslední pozici seřazené podčásti.

  Jak vytvořit ohraničení stránky v aplikaci Microsoft Word

Pro lepší pochopení si ukažme ilustraci výběru.

Podívejme se na kroky k implementaci řazení výběru.

  • Inicializujte pole pomocí fiktivních dat (celých čísel).
  • Iterujte přes dané pole.
    • Udržujte index minimálního prvku.
    • Napište smyčku, která iteruje od aktuálního prvku k poslednímu prvku.
      • Zkontrolujte, zda je aktuální prvek menší než minimální prvek nebo ne.
      • Pokud je aktuální prvek menší než minimální prvek, nahraďte index.
    • Máme s sebou minimální index prvků. Zaměňte aktuální prvek za minimální prvek pomocí indexů.

Časová složitost výběru je O(n^2) a prostorová složitost, pokud O(1).

Zkuste implementovat algoritmus, protože je podobný řazení vkládání. Kód můžete vidět níže.

def selection_sort(arr, n):
	for i in range(n):

		## to store the index of the minimum element
		min_element_index = i
		for j in range(i + 1, n):
			## checking and replacing the minimum element index
			if arr[j] < arr[min_element_index]:
				min_element_index = j

		## swaping the current element with minimum element
		arr[i], arr[min_element_index] = arr[min_element_index], arr[i]

if __name__ == '__main__':
	## array initialization
	arr = [3, 4, 7, 8, 1, 9, 5, 2, 6]
	selection_sort(arr, 9)

	## printing the array
	print(str(arr))

Bublinové řazení

Bubble sort je jednoduchý algoritmus. Při každé iteraci opakovaně zaměňuje sousední prvky, dokud není dané pole seřazeno.

  Použijte Manuskript k organizaci svých spisovatelských projektů v Linuxu

Iteruje pole a přesouvá aktuální prvek na další pozici, dokud nebude menší než další prvek.

Ilustrace nám pomáhají vizuálně porozumět bublinovému řazení. Pojďme se na ně podívat.

Podívejme se na kroky k implementaci bublinového řazení.

  • Inicializujte pole pomocí fiktivních dat (celých čísel).
  • Iterujte přes dané pole.
  • Opakujte od 0 do ni-1. Poslední prvky i jsou již seřazeny.
  • Zkontrolujte, zda je aktuální prvek větší než následující prvek nebo ne.
  • Pokud je aktuální prvek větší než následující prvek, zaměňte dva prvky.
  • Časová složitost bublinového řazení je O(n^2) a prostorová složitost, pokud O(1).

    Bublinové řazení již můžete snadno implementovat. Podívejme se na kód.

    def bubble_sort(arr, n):
    	for i in range(n):
    		## iterating from 0 to n-i-1 as last i elements are already sorted
    		for j in range(n - i - 1):
    			## checking the next element
    			if arr[j] > arr[j + 1]:
    				## swapping the adjucent elements
    				arr[j], arr[j + 1] = arr[j + 1], arr[j]
    
    if __name__ == '__main__':
    	## array initialization
    	arr = [3, 4, 7, 8, 1, 9, 5, 2, 6]
    	bubble_sort(arr, 9)
    
    	## printing the array
    	print(str(arr))

    Sloučit třídění

    Merge sort je rekurzivní algoritmus pro řazení daného pole. Je efektivnější než dříve diskutované algoritmy z hlediska časové složitosti. Sleduje přístup rozděl a panuj.

    Algoritmus slučovacího řazení rozděluje pole na dvě poloviny a třídí je samostatně. Po seřazení dvou polovin pole je sloučí do jednoho seřazeného pole.

    Protože se jedná o rekurzivní algoritmus, rozděluje pole, dokud se pole nestane nejjednodušším (pole s jedním prvkem), které lze seřadit.

    Je čas na ilustraci. Pojďme se na to podívat.

    Podívejme se na kroky k implementaci řazení sloučení.

    • Inicializujte pole pomocí fiktivních dat (celých čísel).
    • Napište funkci nazvanou merge pro sloučení dílčích polí do jednoho seřazeného pole. Přijímá pole argumentů, levý, střední a pravý index.
      • Získejte délky levého a pravého podpole pomocí daných indexů.
      • Zkopírujte prvky z pole do příslušného levého a pravého pole.
      • Iterujte přes dvě dílčí pole.
        • Porovnejte dva prvky dílčích polí.
        • Nahraďte prvek pole menším prvkem ze dvou dílčích polí pro řazení.
      • Zkontrolujte, zda v obou dílčích polích nezůstaly nějaké prvky.
      • Přidejte je do pole.
    • Napište funkci s názvem merge_sort s polem parametrů, levým a pravým indexem.
      • Pokud je levý index větší nebo roven pravému indexu, vraťte se.
      • Najděte střední bod pole a rozdělte pole na dvě poloviny.
      • Rekurzivně volejte merge_sort pomocí levého, pravého a středního indexu.
      • Po rekurzivních voláních sloučte pole s funkcí sloučení.
      Jak připojíte svůj mini fotoaparát k telefonu

    Časová složitost slučovacího řazení je O(nlogn) a prostorová složitost, pokud O(1).

    To je vše pro implementaci algoritmu řazení sloučení. Zkontrolujte kód níže.

    def merge(arr, left_index, mid_index, right_index):
    	## left and right arrays
    	left_array = arr[left_index:mid_index+1]
    	right_array = arr[mid_index+1:right_index+1]
    
    	## getting the left and right array lengths
    	left_array_length = mid_index - left_index + 1
    	right_array_length = right_index - mid_index
    
    	## indexes for merging two arrays
    	i = j = 0
    
    	## index for array elements replacement
    	k = left_index
    
    	## iterating over the two sub-arrays
    	while i < left_array_length and j < right_array_length:
    
    		## comapring the elements from left and right arrays
    		if left_array[i] < right_array[j]:
    			arr[k] = left_array[i]
    			i += 1
    		else:
    			arr[k] = right_array[j]
    			j += 1
    		k += 1
    
    	## adding remaining elements from the left and right arrays
    	while i < left_array_length:
    		arr[k] = left_array[i]
    		i += 1
    		k += 1
    
    	while j < right_array_length:
    		j += 1
    		k += 1
    
    def merge_sort(arr, left_index, right_index):
    	## base case for recursive function
    	if left_index >= right_index:
    		return
    
    	## finding the middle index
    	mid_index = (left_index + right_index) // 2
    
    	## recursive calls
    	merge_sort(arr, left_index, mid_index)
    	merge_sort(arr, mid_index + 1, right_index)
    
    	## merging the two sub-arrays
    	merge(arr, left_index, mid_index, right_index)
    
    if __name__ == '__main__':
    	## array initialization
    	arr = [3, 4, 7, 8, 1, 9, 5, 2, 6]
    	merge_sort(arr, 0, 8)
    
    	## printing the array
    	print(str(arr))

    Závěr

    Existuje mnoho dalších třídicích algoritmů, ale výše jsou uvedeny některé z často používaných. Doufám, že se vám učení třídění líbilo.

    Dále se dozvíte o vyhledávacích algoritmech.

    Veselé kódování 🙂 👨‍💻