对数器&Python实现稳定快排

定义

对数器是通过大量的测试数据来验证算法是否正确的方式
对数器核心部件有两个:

  • 绝对正确的方法
  • 能产生大量随机样例的随机发生器

对数器的使用

  • 有一个你要测的方法a
  • 实现一个绝对正确但是复杂度不好的方法b
  • 实现一个随机数样本发生器
  • 把a和b对比很多次来验证方法a是否正确
  • 如果有一样本对比出错,打印该样本
  • 当数量很多对比依旧正确时,可以确定a正确

按步骤写代码

一、要测试的方法a

以下是快排算法对的一种新的实现方法

def qS(array,start,end):
    if start >= end:
        return array
    if start + 1 == end:
        if array[start] > array[end]:
            array[start],array[end] = array[end],array[start]
        else:
            return array
    if start+1 < end:
        # set up flag(flag is the first param),and set a pointer(is uesed to traves the array),and a count(is used to count the number greater than flag)
        flag = array[start]
        pointer = start + 1
        count = 0
        if pointer == end:
            return array
        else:
            for i in range(start,end):
                if flag < array[pointer]:
                    pointer += 1
                elif flag >= array[pointer]:
                    array[count + start + 1],array[pointer] = array[pointer],array[count + start + 1]
                    count += 1
                    pointer += 1
        array[start],array[start+count] = array[start+count],array[start]
        # recursion sort
        qS(array, start, start + count - 1)
        qS(array, start + count + 1, end)

def quicklySort(array):
    '''
    packaged sort function
    :param array: the array to sort
    :return: sorted array
    '''
    start = 0
    end = array.__len__() - 1
    qS(array,start,end)

quicklySort(array)
print(array)

输入array = [9,8,7,6,5,4,3,2,1,0],返回array的值为[0,1,2,3,4,5,6,7,8,9]
下面是此算法的手稿图(不感兴趣的话请略过,写的有点点乱~):
在这里插入图片描述

二、绝对正确但是复杂度不好的方法b

这里选择Python自带的排序array.sort()方法

def correctSort(array):
    array.sort()
    print(array)

三、实现一个随机样本发生器

import random
def generateRandomArray(maxSize):
    size = int(maxSize * random.random() + 1 )
    array = []
    for i in range(size):
        array.append(int(10 * random.random()) - int(10 * random.random()))
    return(array)

四、对比a和b返回的结果,验证a是否正确

array1 = quicklySort(array)
array2 = correctSort(array)
if array1 == array2:
    print("OK!")
else:
    print("错误样例:\n" + array1 + '\n' + array2)

于是乎,Python对数器出炉啦~,完整代码如下:

def qS(array,start,end):
    if start >= end:
        return array
    if start + 1 == end:
        if array[start] > array[end]:
            array[start],array[end] = array[end],array[start]
        else:
            return array
    if start+1 < end:
        # set up flag(flag is the first param),and set a pointer(is uesed to traves the array),and a count(is used to count the number greater than flag)
        flag = array[start]
        pointer = start + 1
        count = 0
        if pointer == end:
            return array
        else:
            for i in range(start,end):
                if flag < array[pointer]:
                    pointer += 1
                elif flag >= array[pointer]:
                    array[count + start + 1],array[pointer] = array[pointer],array[count + start + 1]
                    count += 1
                    pointer += 1
        array[start],array[start+count] = array[start+count],array[start]
        # recursion sort
        qS(array, start, start + count - 1)
        qS(array, start + count + 1, end)

def quicklySort(array):
    '''
    packaged sort function
    :param array: the array to sort
    :return: sorted array
    '''
    start = 0
    end = array.__len__() - 1
    qS(array,start,end)

def correctSort(array):
    array.sort()

import random
def generateRandomArray(maxSize):
    size = int(maxSize * random.random() + 1 )
    array = []
    for i in range(size):
        array.append(int(10 * random.random()) - int(10 * random.random()))
    return(array)

for i in range(5000):
    array = generateRandomArray(5)
    array1 = quicklySort(array)
    array2 = correctSort(array)
    if array1 == array2:
        print("OK!")
    else:
        print("错误样例:\n" + array1 + '\n' + array2)
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值