Python bubblesort与列表理解

时间:2017-10-31 19:59:34

标签: python list list-comprehension bubble-sort

我是Python的新手,我正在尝试使用bubblesort实现算法,但使用list comprenhension。虽然我使用if和for使用了list comprenhension,但是我无法找到实现嵌套for的方法,以及用于排序的swap。

以下是我尝试使用的代码。

import random as rn
l=[]
N=int(input('Give an integer: '))
for i in range(N):
    l.append(rn.randint(1,100))
print(l)

listset = [l[:k-1] + [l[k]] + [l[k-1]] + l[k+1:] if l[k] > l[k-1] else l for k in range(1,len(l)) ]

print(listset)

对于如何正确使用列表解析以实现bubblesort算法,您有什么建议吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

冒泡排序基本上是将最小的(升序)值冒泡到列表中的顶部,这是在时间O(n^2)中实现的。

在列表理解的情况下,由于我们正在创建新列表,我不认为可以实现精确的就地数字交换冒泡排序算法。虽然通过从未排序列表n次中拾取最小(升序)数字来创建新列表。最终它将创建类似的算法选择排序如下 -

def extractMin(numberList):
   minValue = min(numberList)
   numberList.remove(minValue)
   return minValue

import random as rn
l=[]
N=int(input('Give an integer: '))
for i in range(N):
    l.append(rn.randint(1,100))
print(l)

sorted_list = [extractMin(l) for k in range(len(l))]
print(sorted_list)

函数extractMin(..)的时间复杂度为O(n),被称为n次,因此整个排序的时间复杂度为O(n^2)

答案 1 :(得分:-1)

这是一个纯粹使用列表理解进行排序的解决方案。

$mids = explode("\n", $_POST['invoiceCheck']);
$noErrors = [];  //array to store items that don't generate an error

// ----- loop through all items and print any errors -----

foreach ($mids as $mid){
    if(!empty($mid)) {
        //Check for errors using mysqli
        if(error) {
            //display error
            echo $errorMsg  //replace this with your error message
        } else {
            //add value to array to display later
            $noErrors[] = $mid;
        }
    }
}

// ----- print any items that didn't generate an error -----

foreach ($noErrors as $item) {
    //display each non-error item
    echo $item;
}

输出:

import itertools
s = [5, 6, 2, 4, 5, 6, 7]
new_s = s[:]
temp1 = 0
final_data = [[globals().update(temp1=s[b]), globals().update(s=s[:b]+[temp1]+s[b+1:]), globals().update(s= s[:b]+[s[b+1]]+s[b+1:])] for i in range(len(s)) for b in range(len(s)-1) if s[b+1] < s[b]]
new_final_list = list(itertools.chain.from_iterable([[a]*new_s.count(a) for a, b in itertools.groupby(s)]))