{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "bubble sort all the things" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import matplotlib.animation as animation\n", "from IPython import display\n", "\n", "import random\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First up, generating a random list to sort then actually sorting it:" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAEICAYAAABRSj9aAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAE9VJREFUeJzt3X2wZHWd3/H3Z2dARTE8XSyYEQezrA+xCrUGn2MscTcqKFQFXVyLjC67U0mWFV23dHa3Es2mtgqrNj6thspE1NEYxAAVCFruEhbXmIqjM+gqOJphAWGWAQZkAB82MvrNH+dc09y9dx5ud8/t/vX7VXWr+5w+fc7v9Ln3c7/ndx46VYUkqV2/tNINkCSNl0EvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g15jleS9Sf7zSrdj0iR5S5KvHML0dyR51TjbpHYZ9BpKkh8O/Pw8yU8Ght884mV9KclvLRj3iiS7Rrmc5bZlUiSpJL+80u3Q5DDoNZSqetL8D3An8LqBcZ9Z6faNWjr+3Wiq+Aurw+HIJJ9K8kiSW5Ksn38hyclJrkqyJ8ntSd42zIL6avZfJNmZ5MEkH02S/rVfTvJXSR5Kcn+SKwbe95IkX+9f+3qSlwy89qUkf5LkfwE/Bj4N/GPgI/2ey0f66Z6Z5PokP0jyvSRvHJjH8UmuTfJwkq8B//AA63FBku8neSDJHy147QVJ/neSvUl2J/lIkiP7177cT/bXfdt+PcmxSa7rP+MH++drh/mcNV0Meh0Orwc+CxwDXAvMB+MvAf8d+GtgDXAm8PYk/3TI5Z0NnAGcDrwRmJ/fvwP+AjgWWAv8Wd+O44DPAx8GjgfeD3w+yfED87wA2AgcDbwF+J/ARf2ey0VJnghcD/wX4ETgTcB/SPKP+vd/FPg74CTgN/ufRSV5NnBpv8yT+zYNBvPPgHcAJwAvpvvc/hVAVb28n+b0vm1X0P2dfwJ4GnAK8BP6baDZYNDrcPhKVX2hqn5GVw2f3o8/A5irqj+uqp9W1W3AfwLOH3J5l1TV3qq6E7gReG4//lG6sDu5qv6uquYPhp4F7KyqT1fVvqq6HPgu8LqBeX6yqm7pX390kWWeDdxRVZ/op7kJuAo4L8kq4J8B/6aqflRVNwNb9tP+84DrqurLVfV/gX8N/Hz+xaraXlVf7ZdzB/AfgX+y1Myq6oGquqqqflxVjwB/sr/p1Z7VK90AzYR7Bp7/GHh8ktX0oZtk78Drq+iq5cXsA45YMO4IugDf3/Ke1D9/F11V/7UkDwL/vqo+Tlc1f3/BPL5Pt5cx764l2jTvacALF6zLarp/bHP988F5LFzeoJMHp62qHyV5YH44ya/Q7XWsB47q5719qZklOQr4APBqur0ZgKOTrOr/+apxBr1W0l3A7VV12kFOfyewbsG4U9l/aP5CVd0D/DZAkpcB/6Pv076bLqgHnQJ8cfDtC2e3YPgu4K+q6lcXLrev6PcBT6XbU5if/1J2A88aeP9RdN038y4FvgG8qaoeSfJ2ur2ApbwTeAbwwqq6J8lz+/dnP+9RQ+y60Ur6GvBwkncneUKSVUmek+SMJaa/AnhrfzAyfWX7Drr+/wNK8oaBg5AP0oX1z4AvAL+S5DeSrE7y68Czgev2M7t7gacPDF/Xz+OCJEf0P2ckeVZfNV8NvDfJUX0f/Ib9zPtK4OwkL+sPsv4xj/1bPRp4GPhhkmcC//IAbTuarl9+b3884j37WbYaZNBrxfQB+Dq6PvTbgfuBjwH/YInp/xzYRHdg8SG6gN4CbD7IRZ4BbE3yQ7qDwhdX1e1V9QBdH/s7gQfounjOrqr79zOvD9H1vz+Y5MN93/ev0R1fuJuu++h9wOP66S+i60K6B/hkvw6LqqpbgN+hO7C7m+6f0uC1Ar8P/AbwCN0xjSsWzOK9wJb+rJw3Ah8EnkD3+X6Vx+6paAbELx6RpLZZ0UtS4wx6SWqcQS9JjTPoJalxE3Ee/QknnFDr1q1b6WZI0lTZvn37/VU1d6DpJiLo161bx7Zt21a6GZI0VZIc1MWCdt1IUuMMeklqnEEvSY07YNAn+XiS+5LcPDDuuP4LFnb2j8f245Pkw0luTfKtJM8fZ+MlSQd2MBX9J+lubzpoE3BDf9fBG/phgNcAp/U/G+nusidJWkEHDPqq+jLwgwWjz+H/f3HCFuDcgfGfqs5XgWOSnDSqxkqSDt1y++ifUlW7AfrHE/vxa3jslyvs4rFf3iBJOsxGfTB2sS8yWPT2mEk2JtmWZNuePXtG3AxJ0rzlBv29810y/eN9/fhddN+iM28t3b25/56q2lxV66tq/dzcAS/skiQt03KvjL2W7htyLukfrxkYf1GSzwIvBB6a7+KRNBrrNn3+F8/vuOSsFWyJpsUBgz7J5cArgBOS7KL7GrJLgM8luZDuezzf0E/+BeC1wK10X8r81jG0WZJ0CA4Y9FX1piVeOnORaYvuK9AkSRPCK2MlqXETcffKWWef6+SZ3yZuD7XAil6SGmfQS1LjDHpJapxBL0mNM+glqXEGvSQ1zqCXpMZ5Hr1WXGvXEXgOviaNFb0kNc6gl6TGGfSS1Dj76BvVWr+3pOWzopekxhn0ktQ4u24k6TBYye5UK3pJapxBL0mNM+glqXEz0UfvqYaSZpkVvSQ1zqDXIVm36fOP2UOSNPkMeklqnEEvSY0z6CWpcTNx1o00LTxDTONgRS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIaN1TQJ3lHkluS3Jzk8iSPT3Jqkq1Jdia5IsmRo2qsJOnQLTvok6wB3gasr6rnAKuA84H3AR+oqtOAB4ELR9FQadrN3yfIewXpcBu262Y18IQkq4GjgN3AK4Er+9e3AOcOuQxJ0hCWfWVsVf1tkj8F7gR+AvwFsB3YW1X7+sl2AWsWe3+SjcBGgFNOOWW5zZgZXjEpabmG6bo5FjgHOBU4GXgi8JpFJq3F3l9Vm6tqfVWtn5ubW24zJEkHMEzXzauA26tqT1U9ClwNvAQ4pu/KAVgL3D1kGyVJQxgm6O8EXpTkqCQBzgS+A9wInNdPswG4ZrgmSpKGseygr6qtdAddbwK+3c9rM/Bu4PeS3AocD1w2gnZKkpZpqNsUV9V7gPcsGH0b8IJh5ivBwR2A9iD1eMx/rn6mbfDKWElqnEEvaWbNygVsBr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMes2cWTnTQppn0EtS44a6MlbTyaseJ8u07l1M0+/RNLV1HKzoJalxBr1+wb7rdrltZ5tBL0mNa7aP3upFkjpW9JLUuGYrekntONzfO9DaWTpW9JLUOINekhpn0EtS4wx6SWqcB2On0KR/IXZrB7KkaWdFL0mNM+glqXEGvSQ1bub66Ce9f1uSRs2KXpIaN3MVvcbDM23Ga1Zu0uce93hY0UtS4wx6STpI0/oFLga9JDXOPnpJGqFJPM5gRS9JjTPotWzT2l8pzZqhgj7JMUmuTPLdJDuSvDjJcUmuT7Kzfzx2VI2VJB26YSv6DwFfrKpnAqcDO4BNwA1VdRpwQz88s6x6p5/bUIuZpt+LZQd9kicDLwcuA6iqn1bVXuAcYEs/2Rbg3GEbKUlavmHOunk6sAf4RJLTge3AxcBTqmo3QFXtTnLiYm9OshHYCHDKKacM0QzNmmmpoqRJMUzXzWrg+cClVfU84EccQjdNVW2uqvVVtX5ubm6IZkiS9meYin4XsKuqtvbDV9IF/b1JTuqr+ZOA+4Zt5ME6HJXeJN/TxUq3LW5PjcqyK/qquge4K8kz+lFnAt8BrgU29OM2ANcM1UJJ0lCGvTL2d4HPJDkSuA14K90/j88luRC4E3jDkMuQrG71C5N45emkGyroq+qbwPpFXjpzmPlKkkbHK2MlqXEGvaQmTdMFTeNm0EtS4wz6w8gKQ9JKMOglqXEGvSQ1zqCXpMYZ9JLUOINekhpn0A/Bs2ikyeLf5OIMeklqnEE/IlYSkiaVQS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXosa1VlEno0krTyDXpIaZ9BLEm3vfRr0ktS41SvdAD3WYEVxxyVnrWBLpo+fnbQ4K3pJapxBL0mNm/qum1YPnkjjMv83Y/fW7LCil6TGzXzQt3xKlQ6Nvwtq1cwHvSS1zqCXpMYZ9JLUuKk/60ZtsY9cGj0reklqnBW9VsSsVO6zeM76LK7zpBu6ok+yKsk3klzXD5+aZGuSnUmuSHLk8M2UJC3XKLpuLgZ2DAy/D/hAVZ0GPAhcOIJlSDpEh3pdgNcRHD7zn/Xh+ryHCvoka4GzgI/1wwFeCVzZT7IFOHeYZUiShjNsRf9B4F3Az/vh44G9VbWvH94FrFnsjUk2JtmWZNuePXuGbMboWd1IasWygz7J2cB9VbV9cPQik9Zi76+qzVW1vqrWz83NLbcZkqQDGOasm5cCr0/yWuDxwJPpKvxjkqzuq/q1wN3DN1OStFzLruir6g+qam1VrQPOB/6yqt4M3Aic10+2Abhm6FZKkpZtHBdMvRv4vSS30vXZXzaGZUgTxWM6mmQjuWCqqr4EfKl/fhvwglHMV5I0PG+BIGm/3FuZfga9JDXOe91MMKsoSaNgRS9JjTPoJalxBr0kNc6gl6TGGfSS1DiDXpIa5+mVatLgqal+pZ1mnRW9JDXOoJekxhn0ktQ4g36AN2+S1CKDXpIaZ9BLh8C9Pk0jg16SGud59Dqg+QrW89F1qLyeYTJY0UtS46zop5z9xZIOxIpekhpnRS9pRblXOn5W9JLUOINe0tC8vmCyGfSS1DiDXpIa58FYHTZeeDV5pn2beEHWwbGil6TGWdFLK2AcBy6tbrUUK3pJapxBL0mNM+glqXEGvSQ1btlBn+SpSW5MsiPJLUku7scfl+T6JDv7x2NH11xJ0qEa5qybfcA7q+qmJEcD25NcD7wFuKGqLkmyCdgEvHv4pkrSdJmU20Isu6Kvqt1VdVP//BFgB7AGOAfY0k+2BTh32EZKkpZvJH30SdYBzwO2Ak+pqt3Q/TMATlziPRuTbEuybc+ePaNohrQkb7qlWTZ00Cd5EnAV8Paqevhg31dVm6tqfVWtn5ubG7YZkqQlDBX0SY6gC/nPVNXV/eh7k5zUv34ScN9wTZTGx0pfs2CYs24CXAbsqKr3D7x0LbChf74BuGb5zZMkDWuYs25eClwAfDvJN/txfwhcAnwuyYXAncAbhmuihuU9UDRp3Is6vJYd9FX1FSBLvHzmcucrSRotr4xdIZPSNzwp7ZA0Pga9JDXOoJekIU36nrFBL0mNM+glqXEGvSQ1zqCXpMYZ9JLUOINekhpn0EtS4wx6SWqcQS8t06RfJKPFzeJ2M+glqXHD3KZYksZm1qrucbKil6TGGfSS1DiDXpIaZx+9pMPCPveVY0UvSY0z6CWpcQa9JDXOPnppitnvrYNhRS9JjTPoJWk/Wrg3jkEvSY0z6CWpcQa9JDXOoJekxhn0ktQ4g16SGmfQj0ELp2NJi/F3ezoZ9JLUOINekho3lqBP8uok30tya5JN41iGJOngjDzok6wCPgq8Bng28KYkzx71cg4n+yUlTbNxVPQvAG6tqtuq6qfAZ4FzxrAcSdJBSFWNdobJecCrq+q3+uELgBdW1UULptsIbOwHnwF8b8hFnwDcP+Q8po3r3L5ZW19wnQ/F06pq7kATjeN+9Flk3N/7b1JVm4HNI1tosq2q1o9qftPAdW7frK0vuM7jMI6um13AUweG1wJ3j2E5kqSDMI6g/zpwWpJTkxwJnA9cO4blSJIOwsi7bqpqX5KLgD8HVgEfr6pbRr2cRYysG2iKuM7tm7X1Bdd55EZ+MFaSNFm8MlaSGmfQS1Ljpj7oZ+F2C0memuTGJDuS3JLk4n78cUmuT7Kzfzx2pds6aklWJflGkuv64VOTbO3X+Yr+gH8zkhyT5Mok3+2394tb385J3tH/Xt+c5PIkj29tOyf5eJL7ktw8MG7R7ZrOh/tM+1aS5w+7/KkO+hZvt7CEfcA7q+pZwIuA3+nXcxNwQ1WdBtzQD7fmYmDHwPD7gA/06/wgcOGKtGp8PgR8saqeCZxOt+7Nbucka4C3Aeur6jl0J3CcT3vb+ZPAqxeMW2q7vgY4rf/ZCFw67MKnOuiZkdstVNXuqrqpf/4I3R//Grp13dJPtgU4d2VaOB5J1gJnAR/rhwO8Eriyn6SpdU7yZODlwGUAVfXTqtpL49uZ7uy/JyRZDRwF7Kax7VxVXwZ+sGD0Utv1HOBT1fkqcEySk4ZZ/rQH/RrgroHhXf24ZiVZBzwP2Ao8pap2Q/fPADhx5Vo2Fh8E3gX8vB8+HthbVfv64da299OBPcAn+u6qjyV5Ig1v56r6W+BPgTvpAv4hYDttb+d5S23XkefatAf9Qd1uoRVJngRcBby9qh5e6faMU5Kzgfuqavvg6EUmbWl7rwaeD1xaVc8DfkRD3TSL6fulzwFOBU4GnkjXdbFQS9v5QEb+ez7tQT8zt1tIcgRdyH+mqq7uR987v0vXP963Uu0bg5cCr09yB12X3CvpKvxj+l18aG977wJ2VdXWfvhKuuBveTu/Cri9qvZU1aPA1cBLaHs7z1tqu44816Y96Gfidgt93/RlwI6qev/AS9cCG/rnG4BrDnfbxqWq/qCq1lbVOrrt+pdV9WbgRuC8frLW1vke4K4kz+hHnQl8h4a3M12XzYuSHNX/ns+vc7PbecBS2/Va4J/3Z9+8CHhovotn2apqqn+A1wL/B/gb4I9Wuj1jWseX0e26fQv4Zv/zWro+6xuAnf3jcSvd1jGt/yuA6/rnTwe+BtwK/FfgcSvdvhGv63OBbf22/m/Asa1vZ+DfAt8FbgY+DTyute0MXE53DOJRuor9wqW2K13XzUf7TPs23RlJQy3fWyBIUuOmvetGknQABr0kNc6gl6TGGfSS1DiDXpIaZ9BLUuMMeklq3P8DCribB74EoSoAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data = [random.randint(0,100) for i in range(100)]\n", "plt.title(\"The Unsorted data\")\n", "plt.bar(np.arange(len(data)), data)\n", "plt.show()\n", "\n", "def bubble_sort(data):\n", " done = False\n", " while not done:\n", " swapped = False\n", " for i in range(0, len(data)-1):\n", " if data[i] > data[i+1]:\n", " data[i], data[i+1] = data[i+1], data[i]\n", " swapped = True\n", " if not swapped:\n", " done = True\n", " \n", " return data\n", "\n", "plt.title(\"All sorted\")\n", "plt.bar(np.arange(len(data)), bubble_sort(data));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# eyeballing bubble sort\n", "\n", "todo for now, using plotly or some other library." ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),\n", " array([97, 4, 97, 7, 84, 92, 84, 53, 59, 76]))" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "NUMS = 10\n", "x = np.arange(NUMS)\n", "y = np.random.randint(0, 100, size=NUMS)\n", "x,y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "changing bubble sort to get back a list containing all the steps from the initial list to the final sorted list:" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[97 4 97 7 84 92 84 53 59 76]\n" ] }, { "data": { "text/plain": [ "[array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97]),\n", " array([ 4, 7, 53, 59, 76, 84, 84, 92, 97, 97])]" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def bubble_sort_2(data):\n", " done = False\n", " all_the_sorts = []\n", " all_the_sorts.append(data)\n", " while not done:\n", " swapped = False\n", " for i in range(0, len(data)-1):\n", " if data[i] > data[i+1]:\n", " data[i], data[i+1] = data[i+1], data[i]\n", " all_the_sorts.append(data)\n", " swapped = True\n", " if not swapped:\n", " done = True\n", " \n", " return all_the_sorts\n", "\n", "print(y)\n", "bs_sorts = bubble_sort_2(y)\n", "bs_sorts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "now to eyeball it:" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING:matplotlib.animation:MovieWriter ffmpeg unavailable.\n" ] }, { "ename": "ValueError", "evalue": "outfile must be *.htm or *.html", "output_type": "error", "traceback": [ "\u001b[0;31m--------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;31m#print(f\"it took {len(qs_steps)-1} steps to sort {len(qs_steps[0])} items\")\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlegend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 24\u001b[0;31m \u001b[0mani\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"bubblesort_animate.mp4\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/data/data/com.termux/files/usr/lib/python3.6/site-packages/matplotlib/animation.py\u001b[0m in \u001b[0;36msave\u001b[0;34m(self, filename, writer, fps, dpi, codec, bitrate, extra_args, metadata, extra_anim, savefig_kwargs)\u001b[0m\n\u001b[1;32m 1190\u001b[0m \"animation.\")\n\u001b[1;32m 1191\u001b[0m \u001b[0mrcParams\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'savefig.bbox'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1192\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mwriter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msaving\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdpi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1193\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0manim\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mall_anim\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1194\u001b[0m \u001b[0;31m# Clear the initial frame\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/data/data/com.termux/files/usr/lib/python3.6/contextlib.py\u001b[0m in \u001b[0;36m__enter__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 79\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__enter__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 80\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 81\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 82\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mStopIteration\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"generator didn't yield\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/data/data/com.termux/files/usr/lib/python3.6/site-packages/matplotlib/animation.py\u001b[0m in \u001b[0;36msaving\u001b[0;34m(self, fig, outfile, dpi, *args, **kwargs)\u001b[0m\n\u001b[1;32m 235\u001b[0m '''\n\u001b[1;32m 236\u001b[0m \u001b[0;31m# This particular sequence is what contextlib.contextmanager wants\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 237\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetup\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moutfile\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdpi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 238\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 239\u001b[0m \u001b[0;32myield\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/data/data/com.termux/files/usr/lib/python3.6/site-packages/matplotlib/animation.py\u001b[0m in \u001b[0;36msetup\u001b[0;34m(self, fig, outfile, dpi, frame_dir)\u001b[0m\n\u001b[1;32m 885\u001b[0m \u001b[0mroot\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplitext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moutfile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 886\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mext\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'.html'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'.htm'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 887\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"outfile must be *.htm or *.html\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 888\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 889\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0membed_frames\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mValueError\u001b[0m: outfile must be *.htm or *.html" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "y = bs_sorts\n", "fig, ax = plt.subplots()\n", "fig.set_size_inches(8,6)\n", "ax.set_title(\"Bubble Sort\")\n", "ax.set_xlabel('X')\n", "ax.set_ylabel('Y')\n", "\n", "# this displays the data to be sorted as a scatter plot\n", "original_line = ax.scatter(x,y[0], alpha = 0.2, label = \"original data\")\n", "# the final sorted line.\n", "sorted_line = ax.plot(x,y[-1], lw=2, alpha = 0.7, label=\"sorted\")\n", "\n", "# this displays the data being sorted in a scatter plot\n", "scatterplot = ax.scatter(x,y[0], label=\"sorting\")\n", "\n", "def animate(i):\n", " scatterplot.set_offsets(np.c_[x,y[i]])\n", "\n", "ani = animation.FuncAnimation(fig, animate, \n", " frames=len(y), interval=150, repeat=False) \n", "\n", "#print(f\"it took {len(qs_steps)-1} steps to sort {len(qs_steps[0])} items\")\n", "plt.legend()\n", "ani.save(\"bubblesort_animate.mp4\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }