o
    JAf                     @   s   d Z ddlT ddlZG dd deZG dd deZdd	 Zd
d Zdd Z	dd Z
dd Zd%ddZdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"Zd#Zed$kr_e Ze  dS dS )&a  

         sorting_animation.py

A minimal sorting algorithm animation:
Sorts a shelf of 10 blocks using insertion
sort, selection sort and quicksort.

Shelfs are implemented using builtin lists.

Blocks are turtles with shape "square", but
stretched to rectangles by shapesize()
 ---------------------------------------
       To exit press space button
 ---------------------------------------
    )*Nc                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Blockc                 C   sF   || _ tj| ddd |   | |d dd | d |   d S )NZsquareF)shapeZvisibleg      ?   black)sizeTurtle__init__Zpu	shapesize	fillcolorst)selfr    r   1/usr/lib/python3.10/turtledemo/sorting_animate.pyr	      s   
zBlock.__init__c                 C      |  d d S )NZredr   r   r   r   r   glow       z
Block.glowc                 C   r   )Nr   r   r   r   r   r   unglow#   r   zBlock.unglowc                 C   s   d | jS )NzBlock size: {0})formatr   r   r   r   r   __repr__&   s   zBlock.__repr__N)__name__
__module____qualname__r	   r   r   r   r   r   r   r   r      s
    r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )Shelfc                 C   s   || _ d| _dS )z.create a shelf. y is y-position of first blockijN)yx)r   r   r   r   r   r	   ,   s   
zShelf.__init__c                 C   sP   |  \}}}|d d }|| j|  || jdt|    | | d S )Nr      "   )r
   setyr   setxr   lenappend)r   dwidth_y_offsetr   r   r   push1   s
   z
Shelf.pushc                 C   s0   | |d  D ]}|  \}}||d  qd S Nr   posr!   r   ibZxposr&   r   r   r   _close_gap_from_i9      zShelf._close_gap_from_ic                 C   s0   | |d  D ]}|  \}}||d  qd S r)   r*   r,   r   r   r   _open_gap_from_i>   r0   zShelf._open_gap_from_ic                 C   s,   t | |}|  |d | | |S )N   )listpopr   r    r/   )r   keyr.   r   r   r   r4   C   s
   

z	Shelf.popc                 C   sb   |  | t| || || jd|   | \}}}|d d }|| j|  |  d S )Nr   r   r   )	r1   r3   insertr!   r   r
   r    r   r   )r   r5   r.   r%   r&   r'   r   r   r   r6   J   s   
zShelf.insertN)	r   r   r   r	   r(   r/   r1   r4   r6   r   r   r   r   r   *   s    r   c                 C   sz   t | }td|D ]1}|}|dkr1| | j| |d  jk r1|d }|dkr1| | j| |d  jk s| || | q	d S )N   r   r"   ranger   r6   r4   )shelflengthr-   Zholer   r   r   isortT   s     r<   c                 C   sj   t | }td|d D ]'}|}t|d |D ]}| | j| | jk r$|}q||kr2| || | qd S )Nr   r7   r8   )r:   r;   jZiminr-   r   r   r   ssort]   s   r>   c                 C   sn   | | }|  || | |}t||D ]}| | j|jk r+|  || | |d }q|  || | |S Nr7   )r6   r4   r9   r   )r:   leftrightpivot_indexZpivotZstore_indexr-   r   r   r   	partitiong   s   rC   c                 C   sB   ||k r|}t | |||}t| ||d  t| |d | d S d S r?   )rC   qsort)r:   r@   rA   rB   Zpivot_new_indexr   r   r   rD   r   s   rD   c                  C   s   t   t  ttd} t|  t| D ] \}}t|ttD ]}t| j	|d kr4t
|t| q qtt ttdd t  d S )N
   r7   line)disable_keysclearr3   r9   randomshuffle	enumerater"   sr   r6   r4   	show_textinstructions1instructions2enable_keys)targetr-   tr=   r   r   r   	randomizey   s   

rT   c                 C   s(   d| }t dd|  t| ddd d S )Nr   r   icenter)ZCourier   Zbold)ZalignZfont)Zgotowrite)textrG   r   r   r   rN      s   rN   c                   C   @   t   t  td tt t  tt ttdd t  d S )NzSelection Sortr7   rF   )rH   rI   rN   r>   rM   rO   rP   rQ   r   r   r   r   start_ssort      
rZ   c                   C   rY   )NzInsertion Sortr7   rF   )rH   rI   rN   r<   rM   rO   rP   rQ   r   r   r   r   start_isort   r[   r\   c                   C   sL   t   t  td ttdttd  t  tt ttdd t  d S )NZ	Quicksortr   r7   rF   )	rH   rI   rN   rD   rM   r"   rO   rP   rQ   r   r   r   r   start_qsort   s   
r]   c                  C   s(   t dad} | D ]	}tt| qd S )Ni8)
   r      	   r7      rE            )r   rM   r(   r   )Zvalsr-   r   r   r   
init_shelf   s
   re   c                   C   s,   t d d t d d t d d t d d d S )NrM   r-   qr)onkeyr   r   r   r   rH      s   


rH   c                   C   s6   t td t td t td t td t td d S )Nr-   rM   rf   rg   space)rh   r\   rZ   r]   rT   Zbyer   r   r   r   rQ      s
   



rQ   c                   C   s@   t    t  t  t  tt ttdd t  t	  dS )Nr7   rF   Z	EVENTLOOP)
Z	getscreenZclearscreenZhtZpenupre   rN   rO   rP   rQ   listenr   r   r   r   main   s   
rk   zApress i for insertion sort, s for selection sort, q for quicksortz spacebar to quit, r to randomize__main__)r   )__doc__ZturtlerJ   r   r   r3   r   r<   r>   rC   rD   rT   rN   rZ   r\   r]   re   rH   rQ   rk   rO   rP   r   msgZmainloopr   r   r   r   <module>   s0   *	






