1、随机生成1万个整数,范围在0-10万之间,分别进行简单选择排序、快速排序(自行递归实现的)以及内置sort函数3种排序,打印出3种排序的运行时间。


In [1]:
#python默认的递归深度是很有限,可手工设置递归调用深度

import random,time
import sys,copy
sys.setrecursionlimit(100000)

def sort_simple_selection(seq):
    test_seq = seq.copy()
    start_time = time.time()
    for i in range(len(test_seq)-1):
        min = i
        for j in range(i+1, len(test_seq)):
            if test_seq[j] < test_seq[min]:
                min = j
        test_seq[i], test_seq[min] = test_seq[min], test_seq[i]
    end_time = time.time()

    return end_time - start_time    

def quick_sort(seq):
    test_seq = seq.copy()
    start_time = time.time()
    left_seq =  []
    right_seq = []
    p=test_seq[0]
    for number in test_seq[1:]:
        if number <= p:
            left_seq.append(number)
        else:
            right_seq.append(number)
    if left_seq:
        left_seq = quick_sort(left_seq)
    if right_seq:
        right_seq = quick_sort(right_seq)
        
    end_time = time.time()
    return end_time - start_time  

def computer_sorted(seq):
    test_seq = seq.copy()
    start_time = time.time()
    
    test_seq.sort()
        
    end_time = time.time()
    return end_time - start_time 

random_numbers = [random.randint(0,100000) for i in range(10000)] 
print('sort_simple_selection time =',sort_simple_selection(random_numbers))
print('quick_sort time =',quick_sort(random_numbers))
print('computer_sorted(sort()) time =',computer_sorted(random_numbers))


sort_simple_selection time = 4.676347494125366
quick_sort time = 0.027019262313842773
computer_sorted(sort()) time = 0.003000974655151367

2、随机生成1万个整数,范围在0-10万之间,求其中每个整数出现的次数。并按照整数大小排序输出整数及出现次数。


In [2]:
import random

def sort_randnums(numbers):
    numbers.sort()
    num_freq_dict = {}
    for number in numbers:
        if number in num_freq_dict:
            num_freq_dict[number] += 1
        else:
            num_freq_dict[number] = 1
            
    return  num_freq_dict       

random_numbers = [random.randint(0,100000) for i in range(10000)] 
sorted_numbers = sort_randnums(random_numbers)
print ('从小到大输出其中的前60个:')
for i ,item in enumerate(sorted_numbers):
    print ( '{0:6} {1}'.format(item,sorted_numbers[item]))
    if i == 60:
        break


从小到大输出其中的前60个:
     8 1
    19 1
    29 1
    31 1
    55 1
   107 1
   129 1
   134 1
   146 2
   148 1
   151 1
   178 1
   179 1
   213 1
   214 1
   216 1
   227 1
   231 1
   240 1
   284 1
   301 1
   312 1
   326 1
   328 1
   331 1
   341 1
   343 1
   348 1
   353 1
   370 1
   372 1
   380 1
   386 2
   399 1
   408 1
   415 1
   437 1
   443 1
   479 1
   487 1
   488 1
   497 1
   500 1
   515 1
   529 1
   584 1
   615 1
   625 1
   630 1
   665 1
   685 1
   721 1
   727 1
   744 1
   771 1
   779 1
   781 1
   854 1
   897 1
   928 1
   968 1