In the interview, often encounter some of the problem of sorting algorithm, here, I simply listed a few of the most common sorting algorithms for everyone to learn, perhaps the next day interview exactly use, the second half of the article introduces the collections module, because this module relative to the basic data structure provided by Python (list,tuple,dict) are not familiar to people, but if you know them, it is very convenient and efficient to use them.
Sort algorithm One, bubble sort (bubblesort)
Steps:
- Compare adjacent elements, and if the first one is larger than the second one, swap them both.
- Once the loop is over, the largest number floats to the final position of the list.
- Loop the rest of the numbers again, straight to the finish of all sorts
The code is as follows:
Def swap (A, b): #一种巧妙交换两个数的位置而不用第三个变量的方法 a=b-a b=b-a # b=b-(b-a) = a a=b+a # a=a+ (b-a) = b
return a,bdef Bubblesort (L): # bubble sort for i in range (1,len (L)): for J in Range (0,len (l)-i): # each cycle minus I is because the last number is already ordered if L[J]>L[J+1]: l[j],l[j+1]=l[j+1],l[j] # Exchange two numbers, the exchange here is a unique way of exchanging in Python return Lprint (Bubblesort ([555,2,3,2,3,1,19,3.5,27,24]) # [1, 2, 2, 3, 3, 3.5, 19, 24, 27, 555]
Second, choose the sort Selectionsort
Steps:
- Finds the smallest (large) element in an unordered sequence, and holds it to the starting position of the sort sequence.
- Then continue looking for the smallest (large) element from the remaining unsorted elements, and then place the start of the sort sequence.
- Loop down, straight all the numbers sorted out
The code is as follows:
def selectionsort (L): for I in range (Len (l)): min = i #存放最小元素的下标 for J in Range (I+1,len (l)): if l[ J]<l[min]: min=j #记下最小元素的下标 l[i],l[min] = l[min],l[i] #将最小元素放到列表起始位置 return Lprint (Select Ionsort ([555,2,3,2,3,1,19,3.5,27,24]) #[1, 2, 2, 3, 3, 3.5, 19, 24, 27, 555]
Iii. inserting sort Insertionsort
Steps:
- From the beginning of the first element can be thought to have been sorted, take out the next element, in the ordered sequence of elements from the back forward scanning
- If the element (sorted) is greater than the new element, move the element to the next position until the sorted element is found to be less than or equal to the position of the new element
- After inserting the new element into the position, the loop is repeated so that all the rows are ordered
The code is as follows:
def insertionsort (L): for I in range (1,len (l)): if l[i]<l[i-1]: temp=l[i] # Assign a value to the variable temp For j in Range (i-1,-1,-1): # Loop forward from the queued sequence if l[j]>temp: l[j+1] = l[j] index=j # Note the position that should be inserted else: break l[index]=temp return Lprint (Insertionsort ([555,2,3,2,3,1,19,3.5,27,24]) # [1, 2, 2, 3, 3, 3.5, 19, 24, 27, 555]
Iv. Quick Sort QuickSort
Steps:
- Pick an element from the series as the base number (I chose the first number here)
- Place the number larger than the base number on the left, less than or equal to it, and put it on the right.
- Then the left and right intervals are recursively executed in the previous step until each interval has only one number
The code is as follows:
#这里我用了递归和列表推到式 (do not understand the list push-to-type can be skipped temporarily, said later) def QuickSort (l): If Len (l) <=1: return L return QuickSort ([LT for Lt in L[1:] if lt<l[0] ") + l[0:1] + QuickSort ([ge for GE in l[1:] if ge>=l[0]]) print (QuickSort ([555,2,3,2,3,1,19,3.5 , 27,24]) # [1, 2, 2, 3, 3, 3.5, 19, 24, 27, 555]
Sorting algorithm for the time to write so much, there are some sort algorithm is not written, and some sorting algorithm can be implemented in several different ways, if the following times are sufficient, then to improve, the following talk about Collctions module
Collections Module One, deque
Deque is a double-ended queue, remember the previous list, in general, is to add the deletion from the tail, and deque allow to add or remove elements from either end, deque usage and list very much like, the following code mainly to look at some of the specific usage,
#原生的list也可以从头部添加和取出元素, the time complexity of these two usages of the list object is O (n), #也就是说随着元素数量的增加耗时呈线性上升, The Deque object is the complexity of O (1) from collections import Dequed=deque (' ADF ') print (type (d)) # <class ' Collectio Ns.deque ' >d.appendleft ([3]) # Insert Column alias print (d) # deque from the Left ([[1, 2,], ' a ', ' d ', ' F ']) d.extendleft (' GSSG ') # extends an iterative object from the left side print (d) # deque ([' G ', ' s ', ' s ', ' G ', [1, 2, 3], ' A ', ' d ', ' F ']) print (D.popleft ()) # left side Delete element Gprint (d) # deque ([' s ', ' s ', ' G ', [1, 2, 3], ' A ', ' d ', ' F ']) D.rotate (1) # 1 represents the loop move one step, equivalent to D.appendleft (D.pop ()) Print (d) # deque ([' F ', ' s ', ' s ', ' G ', [1, 2, 3], ' A ', ' d ']) print (d[4]) # Support index, [1, 2, 3]for i in D:print (i) # support for loop # In addition, index (), append (), extend (), reverse (), remove () , Pop (), insert (), and so on, don't say
Second, namedtuple
Namedtuple () is used to create a custom tuple
object, and it specifies the tuple
number of elements and an element that can be referenced by a property rather than an index tuple
.
From collections Import namedtuple# if we want to use a tuple to represent a point (x, y), # This is not very clear to express the meaning, this time can be used namedtuple,# it has a tuple invariance, You can also refer to point=namedtuple (' point ', [' X ', ' Y ']) by property to create a custom tuple object Pointp1=point (11,y=2) with the Namedtuple function # Create an instance of P1p2=point (2,3) print (p1.x) # One per property to get the value print (p2[1]) # 3 also supports index p3=point (* (55,22)) # When passing in a tuple, convert print (p3.x) # 55p4=point (**{' x ': 1, ' Y ': 1}) # Convert print (p4.x) # 1 into a dictionary
Third, defaultdict
dict
when used, if the referenced key does not exist, it will be thrown KeyError,而且py3中没有has_key的方法,每次使用前需要使用in判断
. If you want the key to not exist, return a default value, you can use thedefaultdict。
#传入一个默认的工厂方法, #便会调用这个工厂方法使用其结果来作为这个key的默认值 when a nonexistent key is requested. Dd=defaultdict (lambda: ' NA ') # When key does not exist call Lammbda function dd[' x ']=2print (dd[' y ') # key does not exist, return Naprint (dd[' x ']) # exists with a value of 2print (DD) # defaultdict (<function <lambda> at:, {' X ' 2, ' y ': ' NA '}) #defaultdict还有一种神奇的用法, used as a statistic, Look at the code below s = [(' Yellow ', 1), (' Blue ', 2), (' Yellow ', 3), (' Blue ', 4), (' Red ', 1)]d = defaultdict (list) for K, V in S: D[k] . Append (v) # Key does not exist when you return a list and then add the corresponding element with append print (d) # defaultdict (<class ' list '), {' Yellow ': [1, 3], ' Red ': [1], ' Blue ': [2, 4]}
Iv. ordereddict
Before using Dict, because dict is unordered always can not do loop iteration, etc., if we want to maintain the order of key can use ordereddict, note that the order of key here refers to the order of key insertion, rather than the key itself sort.
From collections Import ordereddictod=ordereddict () od[' x ']=1od[' y ']=2od[' a ']=3print (OD) # ordereddict ([' X ', 1) , (' Y ', 2), (' A ', 3)]) for i in OD: Print (i) # Printing order x->y->a, readers can go down and try to see if the results are the same print (Od.popitem ()) # Will (' A ', 3) Popup, LIFO (LIFO)
Wu, Counter
Counter
is a dict
sub-class, is a simple counter, the following look at his usage
From collections Import counterc1=counter (' Ddkhbb ') # incoming an iterative object print (C1) # Counter ({' d ': 2, ' B ': 2, ' h ': 1, ' K ': 1}) Print (c1[' d ') # c counter update, increase c1.update (' KKK ') print (C1) # Counter ({' K ': 4, ' d ': 2, ' B ': 2, ' H ': 1}) # counter The update that reduces c1.subtract (' kkkkkkkk ') print (C1) # Counter ({' d ': 2, ' B ': 2, ' h ': 1, ' K ':-4}) # elements returns an iterator to how many times the element was repeated in that iteration How many of the elements are included in the device. # Elements with a number less than 1 are not included. The number of k less than 1 is excluded from print (List (c1.elements ())) # [' H ', ' d ', ' d ', ' B ', ' B ']print (C1.most_common (2)) #取出出现次数最多2个元素 [(' B ', 2), (' d ', 2)]
Python full stack development 5, several common sorting algorithms and the data structure provided by the collections module