import operator
import random

def isSorted(op,ls):
    for i in range(len(ls)-1):
        res= op(ls[i],ls[i+1])
        if not res:
            break
    return res

def insertsort(seq):
    x=1
    while x < len(seq):
        key= seq[x]
        k=x-1
        while k>=0 and seq[k]>key:
            seq[k+1]= seq[k]
            k= k-1
        seq[k+1]=key
        x += 1
    return seq    
    
def test_a3():
    for i in range(10):
        xs = insertsort(random.sample(range(100),10))
        print(xs,isSorted(operator.le,xs))


def min_diff(xs):
    xs.sort()
    tp= (xs[1],xs[0],(xs[1]-xs[0]))
    for i in range(1,len(xs)-1):
        if xs[i+1]-xs[i] < tp[2]:
            tp= (xs[i],xs[i+1],(xs[i+1]-xs[i]))
    return tp[:-1]
        
        
def same_average(xs):
    av= sum(xs)//len(xs)
    xs.sort()
    res=[]
    for i in range(len(xs)):
        for j in range(i,len(xs)):
            if (xs[i]+xs[j])//2==av:
                res.append((xs[i],xs[j]))
            elif (xs[i]+xs[j])//2>av:
                break
    return res

    
def quicksort(A):
    X=[]
    res=[]
    c=0
    for i in A:
        X.append((i,c))
        c+=1
    li= quick(X,0,((len(X))-1))
    for i in li:
        res.append(i[0])
    return res
    
def quick(X,low,high):
    if low<high:
        m=partition1(X,low,high)
        quick(X,low,m-1)
        quick(X,m+1,high)
    return X
        
def partition1(X,low,high):
    pval=(X[low])[0]
    pindx=(X[low])[1]
    i=low
    for j in range(low+1,high+1):
            if (((X[j])[0])<pval):
                i=i+1
                X[i],X[j]=X[j],X[i]
            elif (((X[j])[0])==pval) and (((X[j])[1])<pindx):
                i=i+1
                X[i],X[j]=X[j],X[i]
    X[i],X[low]=X[low],X[i]
    return i



print("A3:")
test_a3()
print("min_diff:")
print(min_diff([3,10,3,9,5,1,2,7,6,8]))
print("SameAverage:")
print(same_average([6,25,29,10,6,5,8,0,20,19]))
print("quicksort:")
print(quicksort([6,25,29,10,6,5,8,0,20,19]))