Numpy Tutorial

Creating NumPy Array

NumPy Array Manipulation

Matrix in NumPy

Operations on NumPy Array

Reshaping NumPy Array

Indexing NumPy Array

Arithmetic operations on NumPy Array

Linear Algebra in NumPy Array

NumPy and Random Data

Sorting and Searching in NumPy Array

Universal Functions

Working With Images

Projects and Applications with NumPy

Variations in different Sorting techniques in Python

Sorting is a fundamental operation in computer science, and Python provides a variety of techniques for sorting data. In this tutorial, we'll explore some of the most common sorting techniques and their variations in Python.

1. Built-in sorted() Function

Python's built-in sorted() function can sort any iterable, producing a new sorted list from the elements of any iterable.

lst = [3, 1, 2]
print(sorted(lst))  # Outputs: [1, 2, 3]

Variations:

  • Sorting in Descending Order:

    print(sorted(lst, reverse=True))  # Outputs: [3, 2, 1]
    
  • Sorting Using a Key:

    words = ['apple', 'banana', 'cherry']
    print(sorted(words, key=len))  # Sort by length: Outputs: ['apple', 'cherry', 'banana']
    

2. List's sort() Method

Lists in Python have a built-in sort() method that modifies the list in-place.

lst = [3, 1, 2]
lst.sort()
print(lst)  # Outputs: [1, 2, 3]

The variations (e.g., reverse and key parameters) for the sort() method are the same as for the sorted() function.

3. Sorting Tuples and Objects

Tuples are immutable, so you can't sort a tuple directly. However, you can get a sorted list from a tuple.

tup = (3, 1, 2)
sorted_list = sorted(tup)
print(sorted_list)  # Outputs: [1, 2, 3]

To sort a list of objects, you can use the key argument to specify a function that returns a value to sort by.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

people = [Person('John', 35), Person('Doe', 25), Person('Jane', 30)]
sorted_people = sorted(people, key=lambda p: p.age)
for person in sorted_people:
    print(person.name, person.age)

4. Using the key Argument for Complex Sorting

For multi-level sorting (e.g., sort by age, then by name), you can use a tuple.

people_sorted = sorted(people, key=lambda p: (p.age, p.name))

5. Sorting with numpy

If you're working with numerical data, the numpy library offers efficient sorting algorithms.

import numpy as np

arr = np.array([3, 1, 2])
print(np.sort(arr))  # Outputs: [1 2 3]

6. Sorting with pandas

For structured data (e.g., tables or dataframes), pandas is an excellent tool.

import pandas as pd

df = pd.DataFrame({
    'Name': ['John', 'Doe', 'Jane'],
    'Age': [35, 25, 30]
})

# Sort by Age
print(df.sort_values(by='Age'))

Key Points:

  • The built-in sorted() function returns a new sorted list without modifying the original iterable.

  • The list.sort() method sorts the list in-place and doesn't return a new list.

  • Use the key argument for custom sorting logic.

  • Libraries like numpy and pandas offer specialized sorting functions for numerical and structured data, respectively.

Mastering the various sorting techniques in Python is crucial for data analysis, algorithms, and many other tasks. Depending on the nature of the data and the specific requirements, you can choose the most appropriate sorting method.

1. Different sorting algorithms in Python:

Python provides built-in sorting functions, including the popular Timsort (a hybrid sorting algorithm derived from merge sort and insertion sort).

# Using built-in sorted() function (Timsort)
original_list = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_list = sorted(original_list)

print("Original List:", original_list)
print("Sorted List:", sorted_list)

2. Comparison of sorting techniques in Python:

Compare different sorting techniques using a variety of input sizes to observe their relative performance.

import timeit

# Function to measure time taken by sorting algorithms
def measure_time(algorithm, input_size):
    setup_code = f"from __main__ import {algorithm}, generate_data"
    stmt_code = f"{algorithm}(generate_data({input_size}))"
    time_taken = timeit.timeit(stmt=stmt_code, setup=setup_code, number=100)
    return time_taken

# Sample usage
input_sizes = [100, 1000, 10000]
for size in input_sizes:
    time_taken = measure_time("sorted", size)
    print(f"Time taken for sorted() with size {size}: {time_taken} seconds")

3. Efficiency of sorting algorithms in Python:

Evaluate the efficiency of sorting algorithms by comparing their time complexity.

import timeit

# Function to measure time taken by sorting algorithms
def measure_time(algorithm, input_size):
    setup_code = f"from __main__ import {algorithm}, generate_data"
    stmt_code = f"{algorithm}(generate_data({input_size}))"
    time_taken = timeit.timeit(stmt=stmt_code, setup=setup_code, number=100)
    return time_taken

# Sample usage
algorithms = ["sorted", "bubble_sort", "selection_sort", "quick_sort"]
input_size = 1000
for algorithm in algorithms:
    time_taken = measure_time(algorithm, input_size)
    print(f"Time taken for {algorithm} with size {input_size}: {time_taken} seconds")

4. Python sorting methods and their variations:

Explore various sorting methods available in Python, including custom sorting with key functions.

# Using sort() method with custom key function
original_list = ["apple", "Banana", "orange", "Grapes"]
sorted_list = sorted(original_list, key=lambda x: x.lower())

print("Original List:", original_list)
print("Sorted List:", sorted_list)

5. Comparative analysis of sorting in Python:

Compare the performance of different sorting algorithms using visualizations or statistical analysis.

import matplotlib.pyplot as plt
import numpy as np

# Sample data for sorting algorithms
data_sizes = [100, 500, 1000, 5000]
sorting_times = {
    "Bubble Sort": [0.1, 1.5, 4.2, 25.0],
    "Quick Sort": [0.05, 0.8, 1.5, 10.0],
    # Add times for other sorting algorithms
}

# Plotting comparative analysis
for algorithm, times in sorting_times.items():
    plt.plot(data_sizes, times, label=algorithm)

plt.xlabel("Data Size")
plt.ylabel("Time (seconds)")
plt.legend()
plt.show()

6. Sample code for various sorting techniques in Python:

Provide a sample code snippet showcasing the implementation of various sorting techniques.

# Bubble Sort implementation
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

# Sample usage
data_to_sort = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(data_to_sort)
print("Sorted Array:", data_to_sort)

7. Selection sort vs bubble sort vs quicksort in Python:

Compare the performance of selection sort, bubble sort, and quicksort in Python.

# Sample code comparing selection sort, bubble sort, and quicksort
data_to_sort = [64, 34, 25, 12, 22, 11, 90]

# Selection Sort
selection_sorted = selection_sort(data_to_sort.copy())

# Bubble Sort
bubble_sorted = bubble_sort(data_to_sort.copy())

# Quicksort
quick_sorted = quick_sort(data_to_sort.copy())

print("Original Array:", data_to_sort)
print("Selection Sort:", selection_sorted)
print("Bubble Sort:", bubble_sorted)
print("Quicksort:", quick_sorted)