对列表的一部分进行排序

时间:2010-02-16 12:29:07

标签: python sorting in-place

假设我们有一个清单:

a = [4, 8, 1, 7, 3, 0, 5, 2, 6, 9]

现在,a.sort()将对列表进行排序。如果我们只想对列表的部分进行排序仍然存在,该怎么办?在C ++中我们可以写:

int array = { 4, 8, 1, 7, 3, 0, 5, 2, 6, 9 };
int * ptr = array;
std::sort( ptr + 1, ptr + 4 );

Python中有类似的方法吗?

4 个答案:

答案 0 :(得分:49)

我会这样写:

a[i:j] = sorted(a[i:j])

它也不是就地排序,但对于相对较小的段来说足够快。

请注意,Python只复制对象引用,因此与实际的就地排序相比,速度惩罚不会像预期的那样大。

答案 1 :(得分:20)

如果anumpy数组,那么要对[i, j)范围进行排序,请输入:

a[i:j].sort()

示例:

>>> import numpy as np
>>> a = np.array([4, 8, 1, 7, 3, 0, 5, 2, 6, 9])
>>> a[1:4].sort()
>>> a
array([4, 1, 7, 8, 3, 0, 5, 2, 6, 9])

答案 2 :(得分:0)

要在两个索引之间进行排序,我建议使用quicksort。与array[start:end] = sorted(arr[start:end])相比,快速排序的优势在于,快速排序不需要任何额外的内存,而分配给分片则需要O(n)额外的内存。

我不认为标准库中有实现,但是编写自己很容易。这是我从https://www.geeksforgeeks.org/quicksort-using-random-pivoting/

复制并粘贴的实现
import random 

def quicksort(arr, start , stop): 
    if(start < stop): 
        pivotindex = partitionrand(arr, start, stop) 
        quicksort(arr , start , pivotindex - 1) 
        quicksort(arr, pivotindex + 1, stop) 


def partitionrand(arr , start, stop): 

    randpivot = random.randrange(start, stop) 

    arr[start], arr[randpivot] = arr[randpivot], arr[start] 
    return partition(arr, start, stop) 


def partition(arr,start,stop): 
    pivot = start # pivot 
    i = start + 1 # a variable to memorize where the  
                  # partition in the array starts from. 
    for j in range(start + 1, stop + 1): 
        if arr[j] <= arr[pivot]: 
            arr[i] , arr[j] = arr[j] , arr[i] 
            i = i + 1
    arr[pivot] , arr[i - 1] = arr[i - 1] , arr[pivot] 
    pivot = i - 1
    return (pivot) 

要在您的示例(包括范围)中的索引2和6之间进行排序,我将执行以下操作:

array = [4, 8, 1, 7, 3, 0, 5, 2, 6, 9]
quicksort(array, 2, 6) 
print(array) 

答案 3 :(得分:-1)

根据您的要求,我建议为列表创建自己的排序函数/包装类,并使用排序函数来满足您的要求。

您可以考虑DSU惯用法或schwartzian转换:请参阅http://wiki.python.org/moin/HowTo/Sortinghttp://wiki.python.org/moin/PythonSpeed/PerformanceTips。 我建议你装饰0直到我,i和j之间的元素和0再次j向前。 然后,如果x或y为零,则使用自定义比较函数返回0,使得排序起作用!这可能没有用,因为我们很久以前就越过了Python V2.4。不过,这可能就是你要找的东西。

这个答案在我尝试弄清楚是否可以用更少的努力完成时填写!