Skip to content

Instantly share code, notes, and snippets.

@EssamWisam
Created February 26, 2025 05:00
Show Gist options
  • Save EssamWisam/b47acbc2976f4f55b6c113d1214390f4 to your computer and use it in GitHub Desktop.
Save EssamWisam/b47acbc2976f4f55b6c113d1214390f4 to your computer and use it in GitHub Desktop.
Quick Sort Hands on 6
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"import time\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"\n",
"# =====================================================\n",
"# IMPLEMENTATION 1: QUICKSORT WITH FIXED PIVOT (LAST ELEMENT)\n",
"# =====================================================\n",
"\n",
"def quicksort_fixed(arr):\n",
" stack = [(0, len(arr) - 1)]\n",
"\n",
" while stack:\n",
" low, high = stack.pop()\n",
"\n",
" if low < high:\n",
" pivot_idx = partition_fixed(arr, low, high)\n",
"\n",
" # Push the larger partition first to process the smaller partition earlier\n",
" if pivot_idx - 1 > low:\n",
" stack.append((low, pivot_idx - 1))\n",
" if pivot_idx + 1 < high:\n",
" stack.append((pivot_idx + 1, high))\n",
"\n",
"\n",
"def partition_fixed(arr, low, high):\n",
" \"\"\"\n",
" Partitioning function for fixed pivot quicksort (uses last element as pivot).\n",
" Returns the final position of the pivot after partitioning.\n",
" \"\"\"\n",
" # Choose the last element as the pivot\n",
" pivot = arr[high]\n",
" \n",
" # Index of smaller element (indicates where the boundary is between\n",
" # elements < pivot and elements >= pivot)\n",
" i = low - 1\n",
" \n",
" # Traverse through all elements\n",
" for j in range(low, high):\n",
" # If current element is smaller than the pivot\n",
" if arr[j] < pivot:\n",
" # Increment index of smaller element\n",
" i += 1\n",
" arr[i], arr[j] = arr[j], arr[i]\n",
" \n",
" # Place the pivot element at its correct position\n",
" # (all elements to left are smaller, all to right are greater or equal)\n",
" arr[i + 1], arr[high] = arr[high], arr[i + 1]\n",
" \n",
" # Return the position of the pivot after partitioning\n",
" return i + 1\n",
"\n",
"\n",
"# =====================================================\n",
"# IMPLEMENTATION 2: QUICKSORT WITH RANDOM PIVOT\n",
"# =====================================================\n",
"\n",
"def quicksort_random(arr, low=None, high=None):\n",
" # Initialize low and high for the first call\n",
" if low is None:\n",
" low = 0\n",
" if high is None:\n",
" high = len(arr) - 1\n",
" \n",
" # Base case: If the partition size is 1 or 0, it's already sorted\n",
" if low >= high:\n",
" return\n",
" \n",
" # Choose a random pivot and partition the array\n",
" pivot_idx = partition_random(arr, low, high)\n",
" \n",
" # Recursively sort the left part\n",
" quicksort_random(arr, low, pivot_idx - 1)\n",
" \n",
" # Recursively sort the right part\n",
" quicksort_random(arr, pivot_idx + 1, high)\n",
"\n",
"\n",
"def partition_random(arr, low, high):\n",
" \"\"\"\n",
" Partitioning function for random pivot quicksort.\n",
" Randomly selects a pivot, moves it to the end, and then partitions.\n",
" Returns the final position of the pivot after partitioning.\n",
" \"\"\"\n",
" # Choose a random element as pivot\n",
" pivot_idx = random.randint(low, high)\n",
" \n",
" # Swap the pivot with the last element\n",
" arr[pivot_idx], arr[high] = arr[high], arr[pivot_idx]\n",
" \n",
" # Use the same partitioning method as in fixed pivot quicksort\n",
" # (now that our random pivot is at the end)\n",
" return partition_fixed(arr, low, high)\n",
"\n",
"\n",
"# =====================================================\n",
"# BENCHMARKING FUNCTIONS\n",
"# =====================================================\n",
"def generate_best_case(n):\n",
" \"\"\"Generate best-case input for non-random quicksort.\n",
" Pivot is always the median of the subarray, and other elements are shuffled.\n",
" Example for n=7: [3, 1, 2, 7, 5, 6, 4]\n",
" \"\"\"\n",
" def _build_median_shuffled(low, high):\n",
" if low > high:\n",
" return []\n",
" mid = (low + high) // 2 # Median\n",
" left = _build_median_shuffled(low, mid - 1)\n",
" right = _build_median_shuffled(mid + 1, high)\n",
" subarray = left + right # Elements excluding median\n",
" random.shuffle(subarray) # Randomize to minimize swaps\n",
" return subarray + [mid] # Median at the end\n",
" return _build_median_shuffled(1, n)\n",
"\n",
"\n",
"def generate_worst_case(n):\n",
" # For a fixed last-element pivot, the worst case is when the array is already sorted\n",
" return list(range(1, n + 1))\n",
"\n",
"\n",
"def generate_average_case(n):\n",
" arr = list(range(1, n + 1))\n",
" random.shuffle(arr)\n",
" return arr\n",
"\n",
"\n",
"def benchmark_quicksort(sizes):\n",
" \"\"\"\n",
" Benchmark quicksort for different array sizes and cases.\n",
" Returns execution times for best, worst, and average cases.\n",
" \"\"\"\n",
" best_times = []\n",
" worst_times = []\n",
" avg_times = []\n",
" \n",
" for size in sizes:\n",
" # Best case\n",
" arr_best = generate_best_case(size)\n",
" start = time.time()\n",
" quicksort_fixed(arr_best.copy()) # Use copy to not modify original\n",
" best_times.append(time.time() - start)\n",
" \n",
" # Worst case\n",
" arr_worst = generate_worst_case(size)\n",
" start = time.time()\n",
" quicksort_fixed(arr_worst.copy())\n",
" worst_times.append(time.time() - start)\n",
" \n",
" # Average case\n",
" avg_time_sum = 0\n",
" trials = 5 # Run multiple trials for average case to get a more stable result\n",
" for _ in range(trials):\n",
" arr_avg = generate_average_case(size)\n",
" start = time.time()\n",
" quicksort_fixed(arr_avg.copy())\n",
" avg_time_sum += (time.time() - start)\n",
" avg_times.append(avg_time_sum / trials)\n",
" \n",
" return best_times, worst_times, avg_times\n",
"\n",
"\n",
"# =====================================================\n",
"# PLOT FUNCTION\n",
"# =====================================================\n",
"\n",
"def plot_benchmarks(sizes, best_times, worst_times, avg_times):\n",
" \"\"\"\n",
" Plot the benchmark results.\n",
" \"\"\"\n",
" plt.figure(figsize=(10, 6))\n",
" plt.plot(sizes, best_times, 'g-', marker='o', label='Best Case (Balanced)')\n",
" plt.plot(sizes, worst_times, 'r-', marker='x', label='Worst Case (Sorted)')\n",
" plt.plot(sizes, avg_times, 'b-', marker='s', label='Average Case (Random)')\n",
" \n",
" plt.title('Quicksort Performance (Fixed Pivot)')\n",
" plt.xlabel('Array Size (n)')\n",
" plt.ylabel('Execution Time (seconds)')\n",
" plt.legend()\n",
" plt.grid(True)\n",
" \n",
" \n",
" plt.tight_layout()\n",
" plt.savefig('quicksort_benchmark.png')\n",
" \n",
" "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Running benchmarks...\n",
"Benchmarking complete! Check the generated plots.\n",
"\n",
"Sample benchmark results:\n",
"Size\tBest Case\tWorst Case\tAverage Case\n",
"100\t0.000059s\t0.000298s\t0.000047s\n",
"500\t0.000324s\t0.007384s\t0.000356s\n",
"1000\t0.000798s\t0.032262s\t0.000802s\n",
"2000\t0.001697s\t0.131821s\t0.001880s\n",
"3000\t0.002810s\t0.331603s\t0.003074s\n",
"4000\t0.003771s\t0.550174s\t0.003940s\n",
"5000\t0.005215s\t0.869825s\t0.005408s\n",
"7500\t0.007705s\t2.030338s\t0.008086s\n",
"10000\t0.010617s\t3.575111s\t0.010938s\n",
"15000\t0.016496s\t8.356671s\t0.017662s\n",
"20000\t0.022905s\t14.532131s\t0.023472s\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAp0NJREFUeJzs3Qd4U9UfxvG3LWUv2RtRxAEKKLhARJEhuDc4EHHhFmUosv8qbhQVnDjBDThAQQWZogjiQBARQfbeq7T5P79zTUnbdEHbm7Tfz/OENjc3yck9Scl7z4oJBAIBAQAAAACAHBeb8w8JAAAAAAAMoRsAAAAAgFxC6AYAAAAAIJcQugEAAAAAyCWEbgAAAAAAcgmhGwAAAACAXELoBgAAAAAglxC6AQAAAADIJYRuAAAAAAByCaEbAJCpww8/XNdff3227jNlyhTFxMToo48+yrVy5ReLFy9WmzZtVKZMGXfMxo4d63eRot4PP/ygwoULa9myZVm+z4ABA9zxz2tvvPGGe95//vknRx6vZcuW7uKHq666SldccYUvzw0AkYrQDQD5yO+//65rrrlG1atXV5EiRVStWjV3fcGCBSroRo0apaFDh2brRIMFoeClUqVKOuOMMzRmzJgcL1vnzp3166+/6uGHH9bbb7+tJk2a5PhzFDR9+vRRx44dVbt27eRtFkRD6zT0snDhQkW64EmB4KV48eI67rjj9NBDD2nbtm15Vo5Vq1a5svz8889pbuvVq5c+/vhjzZ8/P8/KAwCRrpDfBQAA5IxPPvnEhYxy5cqpa9euqlOnjms5e+2111xr8/vvv68LL7zwoB570aJFio2NjfrQ/dtvv+mee+7J8n0aNWqk++67LzlovPTSS7rkkks0fPhw3XrrrTlSrt27d2vWrFkuJN5xxx058pgFnYXBr7/+WjNnzkxzW40aNfToo4+m2W4nqCy89u7dW5HO3n8lS5bUjh07NHHiRHey5ttvv9WMGTNcGLdtuck+CwMHDnQnpuwzEqpx48bupNFTTz2lt956K1fLAQDRgtANAPnAkiVLdO211+qII47Q1KlTVbFixeTb7r77btdCay3ev/zyiwvj2WWt5tFq586dKlGixEHd13oM2HELuu6661S3bl0988wzhxy69+zZ47o/r1+/3l0vW7asIuE15wcjR45UrVq1dOqpp6a5zbrwh9ZpaoUKRf5Xo8suu0wVKlRwv9v78NJLL3Un3b7//nuddtpp7n3lJ+te3r9/f7344ovu5AAAFHTR3WwBAHCeeOIJ7dq1Sy+//HKKwG3sy7m10FqrmO0XZGO0raUqK+Naw43p3rJli+699153m4Vya0G0ULphw4Z0y7l3716dd955LvgEWyG3b9/uWp+Dj2PduFu3bq25c+emuO+HH36ok046ScWKFXOvyYLTypUrU+xjZbQv+XYSon379ipVqpSuvvpq1634iy++cON7g11zw732zFSpUkXHHnusli5dmrzNynDDDTeocuXKrvz169fX66+/HnZ8+3vvvedaUy3MW9fg7t27J3d/7tGjR5pyzZs3T+eee65Kly7tXlerVq1csAo3Hvi7777Tbbfd5o6f1YWx192gQQN3suXMM890z2knDYLj7O0+p5xyijumRx99tGsdDmXHyx7TbrN9ypcvr8svvzzN2ONgGayl1V6TvQct9F988cXJJxVCTZgwwZXH6sdeW9OmTV1PhFCzZ89Wu3bt3HvFym372+NnhY2JP/vss7M9Pjv1e9/Cu11PXZ+PPPKI2z5+/PjkbdY93cKw9TQpWrSoa+399NNPww4BsbLZ8bR6+t///qekpCQdCns8E3xfho7pXrt2rTuRYC3T4Xqw2Ot4/vnnk7f9/fffro7tddhxtxMX9tkJfS9bfZkuXbokf57sPRBkn1878TNp0qRDel0AkF9E/ulcAECmPvvsMxfWrEU7nBYtWrjbbT9rfTpUFuDtuf744w8XOE888UQXti1krFixIrkVLnU3auvePmfOHBfugl/craXOQqB1rbbxqRs3btT06dPdY9vjGvtCb1/w7T7WNdiCxLPPPutCmAXT0Fbi/fv3q23btmrevLmefPJJFxwsLG/dutWVzVqpzcG0wCUkJOjff/914dNYOSyUWOiw8lvYtEBp3fttjG3qruyDBw92rZD333+/OwFhJwasXuzkhQ0NsOvBclk4s2NsobRnz56Kj493J08sTAXDcigLx/b8/fr1c4EnaPPmze5Eh01wZWHKuibb7++++64rnx3/Tp06uRMyFhrt9VkYNj/++KM7OWL7W0C0sG33tzLYPAF2bEPdeeedOuyww1wrp+1rY+jtuNjQhiCrS3vP2MmJBx54wNWd1eGXX37pymGsq7SdbLCTLPZYNrTBArCFy2nTpunkk09Ot47sJMjy5cuT3zupJSYmpjkxZCE53PvB3nPWgmwnEixI1qxZ0429twBrdWz1FayrZs2auZMp1j3dTjh88MEHuuiii9z4Zjv5YNasWaOzzjrLvUeD+9mJMgvgh8JOMpng+zKUnQyyExZWHjuWoaxe4uLi3Psi+H4+/fTT3Qm8u+66yz3em2++qQsuuMB9Ru112EmnQYMGuffZzTffnPw3x+4XZJ9je032+Qy+dgAo0AIAgKi2ZcuWgP05v/DCCzPc74ILLnD7bdu2zV3v3LlzoHbt2mn269+/v9svlO1n+wf169fP7fPJJ5+kuX9SUpL7OXnyZLfPhx9+GNi+fXvgzDPPDFSoUCEwb968FPuXKVMmcPvtt6db7n379gUqVaoUaNCgQWD37t3J2z///HP3+FaWICujbevdu3eax+nQoUPY15se27dNmzaB9evXu8v8+fMDV111lXv8O++80+3TtWvXQNWqVQMbNmxIcV/bz17Xrl27UhyLI444Inlb0NKlS91tTzzxRIrtF110UaBw4cKBJUuWJG9btWpVoFSpUoEWLVokbxs5cqS7f/PmzQP79+9P8Rh2zO22UaNGJW9buHCh2xYbGxv4/vvvk7d/9dVXbrs9XlDqsppZs2a5/d566600ZTjnnHOS69/ce++9gbi4OPceNfbTyn/KKaekqEsTvJ/9POqoowJt27ZN8VhWljp16gRat24dyMjXX3/tyvLZZ5+luS14PFJfgu/tcO/91atXB8qVK+eed+/evYHGjRsHatWqFdi6dWvyPq1atQocf/zxgT179qR4Paeffrp7LUH33HOPe/zZs2cnb1u3bp17r9h2ey9kJFi+RYsWufek7f/SSy8FihQpEqhcuXJg586dya/TLkG2j93v119/TfF4xx13XODss89OU75p06Ylb7PPrh33ww8/PJCYmOi2/fjjj2neK6nVq1cvcO6552b4egCgoKB7OQBEOeuebYKtk+kJ3h7c/1BY613Dhg3DtmKl7tJrLcy2HJZ1v7WuqaknXrKWTutKbJMzhWMt4+vWrXMtudYiGdShQwcdc8wxKbq+BnXr1k05wSakstZju9jrtS7uNnb+scces2TmjsP555/vfrfW0+DFWtrtdafuIm+zlGelVdNaY+25raXUxukHVa1a1bUGW0+A1LNV33TTTa7VMjVrwbWW6iDr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9u2rm2++Occfd8CAAWrUqJEi3T///ONamn/++Wd3fcGCBapRo4Z27tzpd9EAAACAAoHQnQMSkxI15Z8pGv3raPfTruem66+/3gWp4MUmgWvXrp1++eUXX0Lltm3b1KdPHx1zzDFu0jFbZuucc87RJ5984pbd8nNm+meffdaVLS+PXSQ77rjjdOqpp+rpp5/2uygAAABAgUDoPkSf/PGJDn/2cJ315lnq9Ekn99Ou2/bcZEHRlmGyyzfffKNChQrpvPPOU16z2d9PP/10vfXWW3rggQc0d+5cTZ06VVdeeaV69uyprVu3yi+vvvqqK1vt2rUj8tj5pUuXLho+fLibTRwAAABA7iJ0HwIL1pd9cJlWbFuRYvvKbSvd9twM3kWKFHEtynaxFunevXvr33//1fr165P3setXXHGFypYtq3LlyunCCy903Y2DpkyZopNPPlklSpRw+zRr1kzLli3TG2+8oYEDB2r+/PnJLcK2LZwHH3zQPebs2bPVuXNn15Jar1493XTTTa5Ls61xbd5++201adJEpUqVcmXu1KmT1q1bl/w4mzdv1tVXX+2WlypWrJiOOuoojRw5MsuvJZz33ntP559//kEdu169ermW+2rVqqlu3bqum3pwtvtwfvzxR7Vu3VoVKlRQmTJldOaZZ7oTEKHsONqJgIsvvtjNmG+v8dNPP02xz++//+5OAJQuXdodqzPOOENLlixJvt3uf+yxx7oeBVa+F198McX9f/jhBzVu3Njdbsd73rx5acpq5dy0aZO+++67DI8fAAAAgENH6A5hXaF37tuZpcu2Pdt014S7FFDa7tPBbXdPuNvtl+7jJBz4/VC6Ye/YsUPvvPOOC4fB9cYtILZt29YFt2nTpmnGjBkuAFsrr609ba2cF110kQuH1rV61qxZbuyzBUNrpb7vvvtUv3795BZh2xZuHWsLthaWLZymZs9nrcjB8gwePNgF+bFjx7rAbF29gyzU2njjCRMm6I8//nAtsRZgs/JawrFQaY9nwTO7x87Yc73++uv6/vvv9cwzz+iVV15xP9Ozfft2d9Jh+vTp7j4WqNu3b++2h7KTGXbywI653W7HzspqVq5cqRYtWriTAt9++61++ukn3XDDDckt0u+++6769eunhx9+2B2jRx55xB23N998M/m1WGC3Ex92XxsicP/994ddwstONtixBAAAAJC7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pLZtbeIhdzWxa1d9fv75Om/ePMUFJ1eL0OCdFYRu5Gu2BJld4LFZ20NnbgcAAAB89ddfUps20tKl3vXbb1fSM89I48crqU8fb6WeKA/ehG4AAAAAQN6bP99r4V67VjrsMOn66yWbJDgh4cA+waCdycpKkYzQDQAAAADIW9One2O4t26VGjaUvvrK1skNv2+UtnAH5Y/ZoQAAAAAA0WH8eK9LuQXu5s2lKVPSD9z5AKEbAAAAAJA33n1XuvBCafduqUMHr4W7bFnlZ4RuAAAAAEDue/556ZprpP37vZ9jxkjFiyu/I3QDAAAAAHJPICANHCjdead3/a67pDfflArIOulMpAYAAAAAyB1JSdLdd3ut3GbQIOmhh6SYGBUUtHSjwHvttdfUxiZyiDLXX3+9LrroouTrV111lZ566ilfywQAAAAks6W/rr3WC9wWsu2nzURegAK3IXRHmREjRqhUqVLab+Mg/rNjxw7Fx8erZcuWKfadMmWKYmJitGTJklwpyxtvvKGyWZz0YN++fXr88cfVsGFDFS9eXBUqVFCzZs00cuRIJYSuw5fH9uzZo759+6p///7J23bt2qUHHnhARx11lKpUqaLKlSvrzDPP1Lhx43I8KOekhx56SA8//LC22iyQAAAAgJ927ZLse++oUVKhQt4EarffroLI19A9depUnX/++apWrZoLh2PHjk1331tvvdXtM3ToUEWMAQOkwYPD32bb7fYcdtZZZ7mQPWfOnORt06ZNc+Fw9uzZLkQGTZ48WbVq1dKRRx6Z7ecJBAIpgv2hsMDdtm1bDRkyRDfffLNmzpypH374QbfffruGDRum33//XX756KOPVLp0aXcCIPS99sknn+jZZ5915Rw/frwuu+wybdy48aCfJzExUUnWtSYXNWjQwNX1O++8k6vPAwAAAGRoyxapbVtvabBixaRPP5U6dlRB5Wvo3rlzp2v5fOGFFzLcb8yYMfr+++9dOI8ocXFSv35pg7ddt+12ew47+uijVbVqVdeKHWS/X3jhhapTp447TqHbLaSbvXv36q677lKlSpVUtGhRNW/eXD/++GOKfe2kxoQJE3TSSSepSJEimj59uubPn+8ew1rXLZzabRb4bf8uXbq4VlW7n10GpHOSwU6U2AmWb775xgXtRo0a6YgjjlCnTp3ciQJrUTZffvmlK5e1npcvX17nnXdeilZ6C+933HGHe/32GmrXrq1HH300+fYtW7boxhtvVMWKFV1Zzz77bFf+jLz33nvuxE+oTz/9VA8++KDat2/vTlrYa77zzjt1ww03JO+zefNmXXfddTrssMNcy/25556rxYsXp+kFYI913HHHueNp93/zzTddi3nwmAXr8d9//9UVV1zh7lOuXDlXn//880+K0N69e/fkY9OzZ093YiQ1ey32mgAAAABfrFkjnXmmNH26txTYpEnSueeqIPM1dFtQ+d///qeLL7443X1WrlzpAs+7777rulDnKgsxO3dm/dK9uzcJgAVsG5tg2+ynXbftdntWHytMgEqPhWBrxQ6y361ruXWBDm7fvXu3C7TB0G0h7eOPP3ahb+7cuapbt65rfd60aVOKx+7du7drkf7jjz90wgkn6Oqrr1aNGjVcQP/pp5/c7VYPp59+ugvTFm5Xr17tLvfff3/Y8lrdnXPOOWrcuHGa2+yxSpQokXwSxoKlhXoL6LGxse69EWwhfu6551yI/eCDD7Ro0SL3uIcffnjyY11++eVat26dO3FgZT3xxBPVqlWrNK8xlJ1YaNKkSYpt1mvAWre3b9+eYTdxK6eVZ9asWS4AW0gP7Spv3dQfe+wxvfrqq64138pvwbpdu3bJx8yOo93H6sJObFivhRkzZqhkyZJuPzvRYGystgX5119/3ZXZXpOdjErt5JNPdq3zdpIFAAAAyFNLl0rNm0u//GJfqqXvvpNCepQWVBE9e7mFrWuvvVY9evRQ/fr1s3QfCxuhgWPbtm3upwWb1GOH7bqFJXseF+x27lRs6dIHV9j//c+7pHc9zNmO0NHQSVbO/8JnZixcWzi1QGbhet68eTrjjDPc63755Zfda7HgZtdtXwuPw4cPd4HNwp156aWXNGnSJBcILSwHg621VltQDVq+fLnuu+8+1atXz10P7apuIdFaa631PPl1hOlCbS3AVo7MulenPvliZbPx1L/99pvrOr1s2TLXKm5B1Z63Zs2ayc9pQdTC5po1a1yrsrEx5DZkwUK6dWtPzVrGraXeQnZo2WzcvL3vrMXcnteOrXUvD3ZBt9djYdsCspXFvP32267l3bqlW/i3x7P31/PPP+96cwRZC70NAQg9ZtYd3Pa3urPXFZzczVq8v/32WzfJm53gsBMewfHgL774or766qvk92+QvRZ7X6xatcqVJxJY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vviCwA3kY9lu6bYJ1O655x4lJCTobFs3UNI333yjnj176r777suNMgIAAAD5w4oVUps20h9/SOXLS+PHSyef7HepAERS6O7Ro4c2btyo2267Tfv27XPbbI3uXr166QGbdREAAABAWn/+KbVuLS1fLlWvLk2aJB17rN+lAhBpoTsmJsbNUt63b1/98ccfbm3uo446SkWKFMmdEgIAAADRbu5cqV07af16qV49aeJEqXZtv0sFIBLHdIdOqLZp0yYdeeSRLnAHbH1BAAAAACl9953UsqUXuE88UZo2jcANFCDZDt3WtbxVq1aqV6+e2rdvnzxjedeuXRnTDQAAAIT69FOpbVtp+3bpzDOlyZOlSpX8LhWASA7d9957r+Lj47V8+XIVL148efuVV16pL7/8MqfLBwAAAESnt96SLrnEW4/7ggsk+65curTfpQIQ6WO6J06cqK+++ko1atRIsd3GdS9btiwnywYAAABEtgEDpLg4qW/flNufeUbq3t37vXNn6dVXpULZ/uoNIB/I9id/586dKVq4g2x8N5OpAQAAoECxwN2vn/d7795SIKBYuz5kiLfttNOk11+XYg96KiUABS10n3HGGXrrrbc0ePDg5NnMk5KS9Pjjj+uss87KjTICAAAAkSnYwt2vn2L379cJP/yguOCQy1atvGXBYmJ8LSKAKAvdFq5tIrU5c+a4dbp79uyp33//3bV0z5gxI3dKCQAAAERy8N69W3GDBqlOcNv553uTqAEo8LLdz6VBgwb6888/1bx5c1144YWuu/kll1yiefPmueXDAAAAgALFZiS3SdP+E7Cx2wRuAP85qNkcypQpoz59+hzMXQEAAID8ISHBG8/92GNuLLdJiotz3cxlQzFTT64GoEDKdku3LQs2ffr05OsvvPCCGjVqpE6dOmnz5s05XT4AAAAg8ixeLJ1+ujdh2n+BO/HBB/XZxx8rsX9/L4z/NwcSgIIt26G7R48e2rZtm/v9119/Vffu3dW+fXstXbrU/Q4AAADkWxawbTbyxo2lOXOkokW97YMGKcmWD7PWbusROmgQwRvAwXUvt3B93HHHud8//vhjnX/++XrkkUc0d+5cF74BAACAfMl6dd5yi/Thh971li2lRo2kcuW8ruTW3Two2LU8MdGfsgKI3tBduHBh7dq1y/3+9ddf67rrrnO/lytXLrkFHAAAAMhXpk6VrrlG+vdfySZKsxbsHj28dbrTw5huAAcTum3WcutG3qxZM/3www96//333Xab0bxGjRq5UUYAAADAH9Z6bd3GH33U61pet640apTUtKnfJQOQX8d0P//88ypUqJA++ugjDR8+XNWrV3fbJ0yYoHbt2uVo4RITE9W3b1/VqVNHxYoVc0uSDR48WIH/JqsAAAAAcs2SJdbiJD3yiBe4b7hBmjePwA0gd1u6a9Wqpc8//zzN9meeeUY57bHHHnPB/s0331T9+vU1Z84cdenSxS1Zdtddd+X48wEAAAAuYNu623fcIe3YIZUtK738snT55X6XDEB+Dd07d+5UiRIlsvyg2d0/PTNnztSFF16oDh06uOuHH364Ro8e7bq1AwAAADluyxbp1lul/4ZQqkUL6e23reXJ75IByM+hu27durr77rvVuXNnVa1aNew+1uXbJlZ7+umn1aJFCz3wwAOHXLjTTz9dL7/8shsvXq9ePc2fP9+tEW7PkZ69e/e6S1BwcreEhAR3iRTBskRSmZASdRT5qKPoQD1FPuooOlBPuS9m+nTFXX+9YpYvVyAuTkn9+yspOFlaFo47dRQdqKfIlxAldZTV8sUEsjBAetGiRXrwwQf1xRdfqGHDhmrSpImqVaumokWLavPmzVqwYIFmzZrlxnpb2L7lllsUl9FMjlmUlJTknvfxxx93j2djvB9++OEMA/2AAQM0cODANNtHjRql4sWLH3KZAAAAkL/EJCbq6PffV72PPlJMUpJ2VKmin7p315Z69fwuGoAIZqt6derUSVu3blXp0qUPLXQHLV++XB9++KGmTZumZcuWaffu3apQoYIaN26stm3b6txzz82RsB303nvvqUePHnriiSfcmO6ff/5Z99xzj2vptlb3rLZ016xZUxs2bMjwQPhxVmTSpElq3bq14uPj/S4OwqCOIh91FB2op8hHHUUH6imX/P234jp3Vuzs2e5q0rXXKnHoUKlUqWw/FHUUHainyJcQJXVkWdPycGahu1B2J1G777773CUvWODu3bu3rrrqKnf9+OOPd2H/0UcfTTd0FylSxF1Ss8qKxAqL1HLhAOoo8lFH0YF6inzUUXSgnnKItTu98450++3S9u1SmTLSSy8p9sors7+8TyrUUXSgniJffITXUVbLlu3Zy/O6uT42NuWfPWtJt27nAAAAwEHZulXq1k0a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tOOO87tkAJB/J1IDAABAAfDrr1LTpgcC9733SrNnE7gB4CARugEAAGCz5krPPecF7t9/lypXliZM8LqUFynid+kAIGrRvRwAAKCgW7vWG7ttIdt06CC9/rpUqZLfJQOAgtfSvXbtWl177bWqVq2aChUqpLi4uBQXAAAARJHx46UTTvACt02W9vzz0mefEbgBwK+W7uuvv17Lly9X3759VbVqVcUweyUAAED02bNH6tXL61JuGjSQRo/2fgIA/Avd06dP17Rp09SoUaOcKwUAAADyzm+/SZ06eZOmmbvukh57zGvpBgD42728Zs2aCthEGwAAAIgu9h3Ouo83aeIFbutCbt3Ln32WwA0AkRK6hw4dqt69e+uff/7JnRIBAAAg561bJ11wgXTnndLevdK550q//OL9BABETvfyK6+8Urt27dKRRx6p4sWLKz4+PsXtmzZtysnyAQAA4FB99ZXUubM3S7kt//XEE9Idd0jMzQMAkRe6raUbAAAAUcAmS3vgAfsC512vX9+bLO344/0uGQAUGNkO3Z3tLCkAAAAi24IFUseOXhdyYy3bjz8uFSvmd8kAoEDJdug2iYmJGjt2rP744w93vX79+rrgggtYpxsAACASJksbMULq3t1r6a5YURo5UurQwe+SAUCBlO3Q/ddff6l9+/ZauXKljj76aLft0UcfdbOaf/HFF26sNwAAAHywfr10443Sp59619u18wJ3lSp+lwwACqxsz15+1113uWD977//au7cue6yfPly1alTx90GAAAAH0yaJJ1wghe4CxeWnnlG+uILAjcARFtL93fffafvv/9e5cqVS95Wvnx5DRkyRM2aNcvp8gEAACAjtvzXgw9KTz/tXT/uOGnUKKlhQ79LBgA4mJbuIkWKaPv27Wm279ixQ4XtrGoOs27s11xzjQv2xYoV0/HHH685c+bk+PMAAABEnYULpVNPPRC4b7tN+vFHAjcARHPoPu+883TzzTdr9uzZCgQC7mIt37feequbTC0nbd682bWe21rgEyZM0IIFC/TUU0/psMMOy9HnAQAAiLrJ0l56STrxROnnn6UKFaRx46QXXpCKF/e7dACAQ+le/txzz7llw0477TQXhs3+/ftd4H722WeVkx577DE3QdtImwDkPzZ2HAAAoMDasEHq1s0L2aZ1a+nNN6WqVf0uGQAgJ0J32bJlNW7c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",
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"sizes = [100, 500, 1000, 2000, 3000, 4000, 5000, 7500, 10000, 15000, 20000]\n",
"\n",
"print(\"Running benchmarks...\")\n",
"best_times, worst_times, avg_times = benchmark_quicksort(sizes)\n",
"\n",
"# Plot results\n",
"plot_benchmarks(sizes, best_times, worst_times, avg_times)\n",
"\n",
"print(\"Benchmarking complete! Check the generated plots.\")\n",
"\n",
"# Print some sample results\n",
"print(\"\\nSample benchmark results:\")\n",
"print(\"Size\\tBest Case\\tWorst Case\\tAverage Case\")\n",
"for i, size in enumerate(sizes):\n",
" print(f\"{size}\\t{best_times[i]:.6f}s\\t{worst_times[i]:.6f}s\\t{avg_times[i]:.6f}s\")\n",
" \n",
"# As we can see below by numbers, best case only slightly better than average case. \n",
"# It makes sense that on average the pivot will be median."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### As for the average runtime complexity"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# On average the array should be split into two nearly equal halves (as uniform distribution would not be biased to any other number)\n",
"# Thus, recurrence is T(n) = 2T(n/2) + θ(n) as we do linear work to partition the array.\n",
"# By applying the master theorem: a=b=2 and d=1, we have a=b^d=2^1=2.\n",
"# Thus, T(n) = θ(n^d lgn) = θ(n lgn) for average case."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "m1",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.12.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment