我没有从提供的分区算法中得到任何输出

问题描述

下面给定的程序应该从列表中随机选择一个元素,即 piv 并返回列表,其中所有小于 piv 的元素在左侧,较大的元素在左侧列表中 piv 的右侧。但我没有得到任何输出,只有空白屏幕。

示例INPUT:[7,9,4,8,3,6,2,5]

如果 piv=8 可能的输出之一 OUTPUT:[4,7,5,9]

import random
def swap(arr,a,b):
    arr[a],arr[b]=arr[b],arr[a]
    return arr
def partition(arr,n):
    piv=random.choice(arr)
    j=(n-1)
    i=0
    while(i<j):
        if(arr[i]<piv and arr[j]<piv):
            i+=1
        elif(arr[i]>piv and arr[j]>piv):
            j-=1
        elif(arr[i]>piv and arr[j]<piv):
            swap(arr,i,j)
            j-=1
            i+=1
        elif(arr[i]<piv and arr[j]>piv):
            j-=1
            i+=1
    return arr
z=[7,5]
y=partition(z,8)
print(y)

解决方法

您只需要添加一些大于号或等号,因为算法没有考虑 piv 和值可以相同。

import random


def swap(arr,a,b):
    arr[a],arr[b] = arr[b],arr[a]
    return arr


def partition(arr,n):
    piv = random.choice(arr)
    print(piv)
    j = (n-1)
    i = 0
    while(i < j):
        if(arr[i] < piv and arr[j] < piv):
            i += 1
        elif(arr[i] > piv and arr[j] > piv):
            j -= 1
        elif(arr[i] >= piv and arr[j] <= piv):
            swap(arr,i,j)
            j -= 1
            i += 1
        elif(arr[i] <= piv and arr[j] >= piv):
            j -= 1
            i += 1
    return arr


z = [7,9,4,8,3,6,2,5]
y = partition(z,8)
print(y)
,
import random
def swap(arr,arr[b]=arr[b],arr[a]
    return arr

def partition(arr,n):
    piv=random.randint(0,len(arr)-1)#randomly chooses an integer to be pivot
    print(arr)
    #print(piv,arr[piv])
    print("The partition is being done around element :",arr[piv])
    #print(arr)
    arr[len(arr)-1],arr[piv] = arr[piv],arr[len(arr)-1]#swaps pivot with last element 
    #print(arr)#updated array 
    i = -1
    j = 0
    pivot = arr[len(arr)-1]
    for j in range(len(arr)):
    
        if(arr[j] < pivot):
            i += 1
            arr[i],arr[j] = arr[j],arr[i]
    arr[i+1],arr[len(arr)-1] = arr[len(arr)-1],arr[i+1]
    return arr
z=[7,5]
y=partition(z,8)
print(y)