2012-05-01 3 views
-3

То, что я пытаюсь сделать, - это запросить пользователя для типа функции сортировки, сортировки patter, размера массива, размера приращения массива и количества тестов. Затем я хочу, чтобы он сохранил его. Тем не менее, есть пара проблем с этой программой.алгоритмы сортировки в python

  1. Как-то, когда я выбираю случайный узор, он дает мне некоторые странные ответ вроде:

    1543 0,002

    600 0,020

    1400 0,08

Ее не очень в порядке. Я думаю, что что-то не так с циклом for.

def rand_array(n): 
''' returns sorted array of integers of size n''' 
    R=[randint(1, 1000*n) for i in xrange(n)] 
    return R 

def sorted_array(n): 
    ''' returns a sorted array of n integers''' 
    return [i for i in xrange(1,n+1)] 

def rev_array(n): 
    '''returns an array of n integers in reverse order''' 
    R= [i for i in reversed(xrange(1,n+1))] 
    return R 

def sort_timehelp(x,f): 
    ''' This times the quick sort algorithm as it must take 3 variables''' 
    high=len(x) 
    low=0 
    t0=clock() 
    f(x,low,high) 
    t1=clock() 
    dt=t1-t0 
    return dt 

def main(): 
    myinfo() 
    info() 
    while True: 
     print '==================== to quit enter Control-c==================' 
     sortfunction=input("Choose a sort function: ") 
     s=input("Choose a pattern: ") 
     n=input("Array Size: ") 
     increment=input("Increment size: ") 
     y=input("Number of tests: ") 

     if s == 1: 
      x=rand_array(n) 
     elif s ==2: 
      x= sorted_array(n) 
     elif s==3: 
      x=rev_array(n) 
     if sortfunction==1: 
      i=0 
      output="algorith: quick sort \n input data: %s" %s 
      print output 
      while i<y: 
       i=i+1 
       ff=0.0 
       array=x[increment-1:n:increment] 
       for my in array: 
        ff+=sort_timehelp(x,quick_sort) 
        output="%d\t %f" %(my, ff) 
        print output 

      saving=input("You want to save data ? type 0 to continue or 1 to save ") 

      if saving == 0: 
       continue 
      if saving == 1: 
       ask=raw_input("Type the name file: ") 
       fileout=open(ask+".csv","w") 
       fileout.write(output) 
       fileout.close() 

Вторая проблема заключается в том, что, когда я пытаюсь сохранить данные, которые он сохраняет только последние данные, но я хочу, чтобы сохранить все.

Буду признателен за любую помощь.

Редактировать: функция выбора времени и массив и алгоритм сортировки Я хочу сохранить числа с шагом и соответствующим временем. (thats where my for loop)

+2

Несколько комментариев: ** 1) ** Почему вы передаете два аргумента в свою функцию сортировки 'sortfun (x, n)'? ** 2) ** Строки вашего документа фактически не описывают ваши функции. ** 3) ** Когда вы говорите, что хотите сохранить все, вы имеете в виду в каждой ветви 'while True' или каждый экземпляр переменной' output'? – bossylobster

+0

строки после 'output = "% d \ t% f"% (my, ff) вывод печати не имеют должным образом отступов. –

+0

вложения верны –

ответ

0

Есть много проблем. Пройдём через них ...

def rand_array(n): 
''' returns sorted array of integers of size n''' 
    R=[randint(1, 1000*n) for i in xrange(n)] 
    return R 

Это не возвращает отсортированный массив случайных чисел. Он возвращает список случайных целых чисел, выбранных из последовательно более крупных доменов. Вы, вероятно, хотите:

def rand_array(n): 
''' returns sorted array of integers of size n''' 
    return sorted([randint(1, 1000) for i in xrange(n)]) 

def sorted_array(n): 
    ''' returns a sorted array of n integers''' 
    return [i for i in xrange(1,n+1)] 

Это должно быть просто:

def sorted_array(n): 
    ''' returns a sorted array of n integers''' 
    return range(1, n + 1) 

def rev_array(n): 
    '''returns an array of n integers in reverse order''' 
    R= [i for i in reversed(xrange(1,n+1))] 
    return R 

просто:

def rev_array(n): 
    '''returns an array of n integers in reverse order''' 
    return reversed(sorted_array(n)) 

  i=0 
      output="algorith: quick sort \n input data: %s" %s 
      print output 
      while i<y: 
       i=i+1 
       ff=0.0 
       array=x[increment-1:n:increment] 
       for my in array: 
        ff+=sort_timehelp(x,quick_sort) 
        output="%d\t %f" %(my, ff) 
        print output 

Так вы сортировкой столько раз (во внутреннем цикле), как у вас есть элементы массива? Не знаю, почему.Во всяком случае, дело с i просто должно быть сделано с for цикла:

  print "algorith: quick sort \n input data: %s" %s 
      for i in range(y): 
       ff = 0.0 
       array = x[increment-1:n:increment] 
       for my in array: 
        ff += sort_timehelp(x, quick_sort) 
        output = "%d\t %f" %(my, ff) 
        print output 

  saving=input("You want to save data ? type 0 to continue or 1 to save ") 

      if saving == 0: 
       continue 
      if saving == 1: 
       ask=raw_input("Type the name file: ") 
       fileout=open(ask+".csv","w") 
       fileout.write(output) 
       fileout.close() 

Предложение if saving==0 могут быть удалены; любое значение saving кроме 1 пропустит сохранение.

Скотт указал, что вы хотите "a" вместо "w" в open. Еще одна вещь, которую вы могли бы сделать, - переместить open и close из цикла. Вы также можете использовать встроенный модуль Python csv.

3

Ваш случайный шаблон на самом деле является случайным шаблоном, а не отсортированным списком, как предлагает докштрина.

Чтобы сохранить все, откройте выходной файл для добавления, а не только запись (которая, как вы уже нашли, перезаписывает предыдущее содержимое). То есть, используйте «a» вместо «w».