def getinput(tinput,k):
size=len(tinput)
if size==0 or k>size:
return []
array=sort(tinput,size)
return array[:k]
def sort(array,size):
for i in range(int(size/2-1),-1,-1):
array=adjust(array,i,size-1)#
for j in range(size-1,-1,-1):
temp=array[j]
array[j]=array[0]
array[0]=temp
array=adjust(array,0,j-1)
return array
def adjust(array,start,end):
temp=array[start]
i=start*2+1
while i<=end:
if i+1<end and array[i+1]>array[i]:
i+=1
if array[i]<temp:
break
array[start]=temp
start=i
i=start*2+1
array[start]=temp
return array
选择排序
def choose_sort(r):
length=len(r)
for i in range(length):
minmum=i
for j in range(i+1,length):
if lis[minmum]>lis[j]:
minmum=j
if i!=minmum:
swap(i,minmum)
快速排序
def quicksort(r):
if (low<=high):
div=partion(r,0,len(r))
quicksort(r,0,div-1)
quicksort(r,div+1,len(r))
def partion(r,low,high):
lis=r
key=lis[low]
while low<high:
while low<high and lis[high]>=key:
hight-=1
swap(low,high)
while low<high and lis[low]<=key:
low+=1
swap(low,high)
return low
key=lis[low]
while low<high:
while low<high and lis[high]<key:
high-=1
swap(low,high)
while low<high and lis[low]>key:
low+=1
swap(low,high)
归并排序
def merge_sort(arr,temp,s,end):
temp=[None for i in range(len(arr))]
if s<end:
mid=int((s+end)/2)
merge_sort(arr,temp,s,mid)
merge_sort(arr,temp,mid+1,end)
merge(arr,temp,s,mid,end)
def merge(arr,temp,s,m,end):
i=s
j=m+1
t=0
while(i<=m and j<=end):
if arr[i]<=arr[j]:
temp[t]=arr[i]
i+=1
else:
temp[t]=arr[j]
j+=1
t+=1
while(i<=m):
temp[t]=arr[i]
t+=1
i+=1
while(j<=end):
temp[t]=arr[j]
t+=1
j+=1
t=0
while(s<=end):
arr[s]=temp[t]
s+=1
t+=1
def merge_sort(arr,temp,s,end):
temp=[None for i in range(len(arr))]
if s<end:
mid=int((s+end)/2)
merge_sort(arr,temp,s,mid)
merge_sort(arr,temp,mid+1,end)
merge(arr,temp,s,mid,end)
def merge(arr,temp,s,m,end):
i=s
j=m+1
t=0
while(i<=m and j<=end):
if arr[i]<=arr[j]:
temp[t]=arr[i]
i+=1
else:
temp[t]=arr[j]
j+=1
t+=1
while(i<=m):
temp[t]=arr[i]
t+=1
i+=1
while(j<=end):
temp[t]=arr[j]
t+=1
j+=1
t=0
while(s<=end):
arr[s]=temp[t]
s+=1
t+=1
import tensorflow as tf
class TextCnn:
def __init__(self,sequence_length,num_classes,embedding_size,filter_sizes,num_filters,l2_reg_lambda=0.0,attention_dim=100,use_attention=True):
self.embedded_chars=tf.placeholder(tf.float32,[None,sequence_length,embedding_size],name='embedded_chars')
self.input_y=tf.placeholder(tf.float32,[None,num_classes],name='input_y')
self.dropout_keep_prob=tf.placeholder(tf.float32,name='dropout_keep_prob')
self.sequence_length=sequence_length
self.embedding_size=embedding_size
l2_loss=tf.constant(0.0)
if use_attention:
self.attention_hidden_dim=attention_dim
self.attention_W=tf.Variable(tf.random_uniform([self.embedding_size,self.attention_hidden_dim],0.0,1.0),name='attention_W')
self.attention_U=tf.Variable(tf.random_uniform([self.embedding_size,self.attention_hidden_dim],0.0,1.0),name='attendion_U')
self.attention_V=tf.Variable(tf.random_uniform([self.attention_hidden_dim,1],0.0,1.0),name='attention_V')
self.output_att=list()
with tf.name_scope('attention'):
input_att=tf.split(self.embedded_chars,self.sequence_length,axis=1)
for index,x_i in enumerate(input_att):
x_i=tf.reshape(x_i,[-1,self.embedding_size])
c_i=self.attention(x_i,input_att,index)
inp=tf.concat([x_i,c_i],axis=1)
self.output_att.append(inp)
input_conv = tf.reshape(tf.concat(self.output_att,axis=1),[-1,self.sequence_length,self.embedding_size*2],name='input_convolution')
self.input_conv_expanded=tf.expand_dims(input_conv,-1)
else:
self.input_conv_expanded=tf.expand_dims(self.embedded_chars,-1)
dim_input_conv=self.input_conv_expanded.shape[-2].value
pooled_outputs=[]
for i,filter_size in enumerate(filter_sizes):
with tf.name_scope('conv-maxpool-%s'%filter_size):
filter_shape=[filter_size,dim_input_conv,1,num_filters]
W=tf.Variable(tf.truncated_normal(filter_shape,stddev=0.1),name='W')
b=tf.Variable(tf.constant(0.1,shape=[num_filters]),name='b')
conv=tf.nn.conv2d(self.input_conv_expanded,W,strides=[1,1,1,1])
padding=VALID
name='convolution')
h=tf.nn.relu(tf.nn.bias_add(conv,b),name='relu')
pooled=tf.nn.max_pool(h,ksize=[1,sequence_length-filter_size+1,1,1],strides=[1,1,1,1],padding='valid',name='pool')
pooled_outputs.append(pooled)
num_filters_total=num_filters*len(filter_sizes)
self.h_pool=tf.concat(pooled_outputs,3)
self.h_pool_flat=tf.reshape(self.h_pool,[-1,num_filters_total])
with tf.name_scope('dropout'):
self.h_drop=tf.nn.dropout(self.h_pool_flat,self.dropout_keep_prob)
with tf.name_scope('output')
W = tf.get_variable('W',shape=[num_filters_total,num_classes],initializer=tf.contrib.layers.xavier_initialzer())
b=tf.Variable(tf.constant(0.1,shape=[num_classes]),name='b')
l2_loss+=tf.nn.l2_loss(W)
l2_loss+=tf.nn.l2_loss(b)
self.scores=tf.nn.xw_plus_b(self.h_drop,W,b,name='scores')
self.predictions=tf.argmax(self.scores,1,name='predictions')
self.probabilities=tf.nn.sigmoid(self.scores,name='probabilities')
with tf.name_scope('loss):
losses=tf.nn.sigmoid_cross_entropy_with_logits(logits=self.scores,labels=self.input_y)
self.loss=tf.reduce_mean(losses)+l2_reg_lambda*l2_loss
with tf.name_scope('accuracy'):
correct_predictions=tf.equal(self.predictions,tf.argmax(self.input_y,1))
self.accuracy=tf.reduce_mean(tf.cast(correct_predictions,'flot'),name'accuracy')
def attention(self,x_i,x,index):
e_i=[]
c_i=[]
for output in x:
output=tf.reshape(output,[-1,self.embedding_size])
atten_hidden=tf.tanh(tf.add(tf.matmul(x_i,self.attention_W),tf.matmul(output,self.attention_U)))
e_i_j=tf.matmul(atten_hidden,self.attention_V)
e_i.append(e_i_j)
e_i=tf.concat(e_i,axis=1)
alpha_i=tf.nn.softmax(e_i)
alpha_i=tf.split(alpha_i,self.sequence_length,1)
for j,(alpha_i_j,output) in enumerate(zip(alpha_i,x):
if j==index:
continue
else:
output=tf.reshape(output,[-1,self.embedding_size])
c_i_j=tf.multiply(alpha_i_j,output)
c_i.append(c_i_j)
c_i=tf.reshape(tf.concat(c_i,axis=1),[-1,self.sequence_length-1,self.embedding_size])
c_i=tf.reduce_sum(c_i,1)
return c_i
#KMP
def getnextarray(t):
next=[-1,0]
for i in range(2,len(t)):
next.append(0)
for j in range(2,len(t)):
k=next[j-1]
while k!=-1:
if t[j-1]==t[k]:
next[j]=k+1
else:
k=next[k]
next[j]=0
return next
def kmpalg(s,t):
next=getnextarray(t)
i=0
j=0
while i<len(s) or j<len(t):
if j==-1 or s[i]==t[j]:
i+=1
j+=1
else:
j=next[j]
if j==len(t):
return i-j
else:
return -1
#计算base的exponent次方
def Power(self, base, exponent):
# write code here
if base==0:#若底为0,返回0
return 0
sum=1#注意要初始化一个存储计算结果的变量,不能直接对base进行叠乘,因为直接叠乘会改变base的大小
if exponent>0:#次方大于0,正常操作
for i in range(exponent):
sum=sum*base
return sum
elif exponent==0:#次数等于0,返回1
return 1
else:#次数小于0,先将次数取反,最后返回的是求完积之后的倒数
exponent=-(exponent)
for i in range(exponent):
sum=sum*base
return 1.0/sum
#调整数组顺序使奇数位于偶数前面
def reOrderArray(self, array):
# write code here
#ood,even=[],[]#新建两个列表,分别存储奇数、偶数
#
#for a in array:#数组可以通过循环依次得到各个元素
# if a%2==0:
# even.append(a)
# else:
# ood.append(a)
#return ood+even
for i in range(1,len(array)):
if (array[i]%2)!=0 and i!=0:
temp=array[i]
j=i-1
while j>=0 and (array[j]%2)==0:
array[j+1]=array[j]
j-=1
array[j+1]=temp
return array
#链表中倒数第k个节点
def FindKthToTail(self, head, k):
# write code here
#方法一:先遍历一遍得到链表长度,再遍历到第n-k+1个节点即为倒数第k个节点
#方法二:设置两个指针,一个先走k-1步,然后另一个指针开始走,两个始终相差k-1,直到前面的指针走到
#最后一个节点输出后面指针指向的节点
if head==None or k==0:
return None
else:
bef=head
for i in range(k-1):#注意先走k-1步,由于range从0开始,先走一步的时候要k-1!!!!!!!!
if bef.next!=None:
bef=bef.next
else:
return None
after=head
while bef.next!=None:
bef=bef.next
after=after.next
return after
def Merge(pHead1,pHead2):
dummy=ListNode(0)
pHead=dummy
while pHead1 and pHead2:
if pHead1.val>=pHead2.val:
dummy.next=pHead2
pHead2=pHead2.next
else:
dummy.next=pHead1
pHead1=pHead1.next
dummy=dummy.next
if pHead1:
dummy.next=pHead1
if pHead2:
dummy.next=pHead2
return pHead.next
def Merge(self, pHead1, pHead2):
# write code here
dummy = ListNode(0)
pHead = dummy
while pHead1 and pHead2:
if pHead1.val >= pHead2.val:
dummy.next = pHead2
pHead2 = pHead2.next
else:
dummy.next = pHead1
pHead1 = pHead1.next
dummy = dummy.next
if pHead1:
dummy.next = pHead1
if pHead2:
dummy.next = pHead2
return pHead.next
def Merge(self, pHead1, pHead2):
# write code here
ListNode mergenode=null
ListNode current=null
while pHead1!=null and pHead2!=null:
if pHead1.val<=pHead2.val:
if mergenode==null:
mergenode=current=pHead1
else:
current.next=pHead1
pHead1=pHead1.next
else:
if mergenode==null:
mergenode=current=pHead2
else:
current.next=pHead2
pHead2=pHead2.next
return mergenode
ListNode Merge(ListNode list1,ListNode list2):
if list1==None:
return list2
if list2==None:
return list1
if list1.val<list2.val:
res=list1
res.next=Merge(list1.next,list2)
elif list1.val>list2.val:
res=list2
res.next=Merge(list1,list2.next)
return res
def HasSubtree(proot1,proot2):
result=False
if proot1!=None and proot2!=None:
if proot1.val==proot2.val:
result=doestree(proot1,proot2)
if not result:
result=Has(proot1.left,proot2)
if not result:
result=Has(proot1.right,proot2)
def doestree(proot1,proot2):
if proot2==None:
return True
if proot1==None:
return False
if proot1.val!=proot2.val:
return False
return does()and does()
char *strcpy(char *strDes,const char *string)
{
if(string==NULL &&strDes==NULL)
{return NULL;
}
char* address=strDes
while(*string!='\0'){
*(strDes++)=*(string++);
}
*strDes='\0';
return address
}
#二叉搜索树的后序遍历序列
def VerifySquenceOfBST(self, sequence):
if sequence==None or len(sequence)==0:
return None
node=sequence[-1]
length=len(sequence)
for i in range(length):
if sequence[i]>node:
break
for j in range(i):
if sequence[j]>node:
return False
for j in range(i,length):
if sequence[j]<node:
return False
left=True
if i>0;
left=VerifySquenceOfBST(sequence[:i])
right=True
if i<length-1:
right=VerifySquenceOfBST(sequence[i:-1])
return left and right
def FindPathMain(root,path,currentSum):
currentSum+=root.val
path.append(root)
isLeaf=(root.left==None and root.right==None)
if currentSum==expectNumber and isLeaf:
onePath=[]
for node in path:
onePath.append(node.val)
result.append(onepath)
if currentSum<expectNumber:
if root.left:
FindPathMain(root.left,path,currentSum)
if root.right:
FindPathMain(root.right,path,currentSum)
path.pop()
def FindPathMain(root,path,currentSum):
currentSum+=root.val
path.append(root)
if currentSum==expect:
onepath=[]
for i in path:
onepath.append(i)
result.append(onePath)
elif currentSum<expect:
if root.left:
FindPathMain(root.left,path,currentSum)
if root.right:
FindPathMain(root.left,path,currentSum)
path.pop()
#字符串的排列
def Permutation(ss):
if not ss:#若为空
return []
res=[]
helper(ss,res,'')
return sorted(list(set(res)))
def helper(ss,res,path):
if not ss:#ss若为空,将得到的path存入结果res
res.append(path)
else:
for i in range(len(ss)):
helper(ss[:i]+ss[i+1:],res,path+ss[i])
#连续子数组的最大和
def FindGreatestSumOfSubArray(self, array):
# write code here
n = len(array)
dp = [ i for i in array]#dp存储历史上的和的最大值 先对dp初始化为数组元素
for i in range(1,n):
#不断对数组元素依次求和,遇到比前面的和更大的元素,更换max为该元素;否则一直求和,并记录每次求和结果
dp[i] = max(dp[i-1]+array[i],array[i])
return max(dp)#最后返回求和过程中的最大值
sum=array[0]
res=-0xffffffff
for i in range(1,len(array)):
sum=sum+array[i]
if sum<0:
if res<(sum-array[i]):
res=sum-array[i]
sum=0
else:
if sum>res:
res=sum
return res
max_sum = array[0]
pre_sum = 0
for i in array:
if pre_sum < 0:
pre_sum = i
else:
pre_sum += i
if pre_sum > max_sum:
max_sum = pre_sum
return max_sum
#丑数
def choushu(index):
ind=1
res=[1]
x=y=z=0
while ind<index:
minnum=min(2*res[x],3*res[y],5*res[z])
res.append(minnum)
if minnum<=2*res[x]:
x+=1
if minnum<=3*res[y]:
y+=1
if minnum<=5*res[z]:
z+=1
ind+=1
return minnum
#归并排序
def merge_sort(arr,temp,s,end):
temp=[None for i in range(len(arr))]
if s<end:
mid=(s+end)//2
merge_sort(arr,temp,s,mid)
merge_sort(arr,temp,mid+1,end)
merge(arr,temp,s,mid,end)
def merge(arr,temp,s,m,end):
i=s
j=m+1
t=0
while (i<=m and j<=end):
if arr[i]<arr[j]:
temp[t]=arr[i]
i+=1
else:
temp[t]=arr[j]
j+=1
t+=1
while i<=m:
temp[t]=arr[i]
i+=1
t+=1
while j<=end:
temp[t]=arr[j]
j+=1
t+=1
for i in range(end):
arr[i]=temp[i]
def FindFirstCommonNode(self, pHead1, pHead2):
# write code here
#两个链表第一个公共节点之后的节点都是重复的,
#所以从链尾开始查找,找到最后一个两个链表相同的节点
nodes=[]
while pHead1:
nodes.append(pHead1)
pHead1=pHead1.next
id=0
while pHead2:
if pHead2.val==nodes[id].val:
return pHead2
pHead2=pHead2.next
id+=1
def GetNumberOfK(self, data, k):
# write code here
if self.endk(data,k,0,len(data)-1)==-1:#表示data中没有k
return 0
else:
return self.endk(data,k,0,len(data)-1)-self.firstk(data,k,0,len(data)-1)+1
#注意最后要加1,才是k的个数
#下面两个函数 是一样的,只是一个找第一个一个找最后一个,其中的一些判断条件不同
#找到第一个k出现的位置
def firstk(self,data,k,first,end):
if first>end:#递归终止条件,返回-1
return -1
#二分查找
mid=int((first+end)/2)
middata=data[mid]
if middata==k:
if (mid>0 and data[mid-1]!=k)or mid==0:#若mid在大于0的时候对应的前一个位置的值不是k,或者此时mid=0
return mid#找到第一个位置的k
else:
end=mid-1
elif middata<k:
first=mid+1
elif middata>k:
end=mid-1
return self.firstk(data,k,first,end)#每次递归要传入查找的范围
#找到最后一个k出现的位置
def endk(self,data,k,first,end):
if first>end:
return -1
mid=int((first+end)/2)
middata=data[mid]
if middata==k:
if (mid+1<(len(data)) and data[mid+1]!=k)or mid==(len(data)-1):
return mid#找到第一个位置的k
else:
first=mid+1
elif middata<k:
first=mid+1
elif middata>k:
end=mid-1
return self.endk(data,k,first,end)
#把字符串转成整数
def str2num(s):
slist=['1','2','3','4','5','6','7','8','9','0']
fuhao=['-','+']
first=0
sum=0
direct=0#未被赋值,即没有符号
for i in s:
if i not in slist and i not in fuhao:
return 0
if first==0 and i in fuhao:#第一个位置
first=1
if i=='-':
direct=-1
else:
direct=1
else:
sum=sum*10+i
if direct==0:
direct=1
return direct*sum
def isNumeric(self, s):
'''
# write code here
length=len(s)
#需要判断的三种符号
hase=False
hasdot=False
hassigh=False
if length<=0:
return False
else:
for i in range(length):#对每个元素依次判断
if s[i]=='e' or s[i]=='E':
if hase:#若已经有了e或E则false
return False
else:#若之前没有,则记录为True
hase=True
if i==length-1:#e的位置不能是最后一个
return False
elif s[i]=='.':
if hasdot or hase:
return False
else:
hasdot=True#不能用==,之前用错了!!!!
if hase:#若已经有了e,后面不能有.
return False
elif s[i]=='+' or s[i]=='-':#+-可以出现在e后面,或者第一个位置(直接判断其位置不行吗?)
if hassigh:#注意!!!!!!!这个地方,判断条件是如果之前出现过+-
if s[i-1]!='e' and s[i-1]!='E':
return False
else:#没有e的话,+-只能出现在开头 注意!!这里判断的不是是否有e而是之前是否有符号位出现过
hassigh=True
if i!=0 and s[i-1]!='e' and s[i-1]!='E':#若+-不在第一个位置或者不在e后面
return False
elif s[i]<'0' or s[i]>'9':
return False
#不能在循环中返回,否则在判断第一个元素后就会返回,不再继续比较
#else:
#return True
return True
#序列化和反序列化二叉树
'''def Serialize(self, root):
self.s = ''
self.sarializeCore(root)
return self.s
def sarializeCore(self,root):
if root is None:
self.s += "#,"
return
self.s += str(root.val)+","
self.sarializeCore(root.left)
self.sarializeCore(root.right)
return self.s#这句没有也可
def Deserialize(self, s):
if s is None:
return None
if len(s)==1 and s[0]=="#":
return None
self.index = 0
s= s.split(',')
root = self.DeserializeCore(s)
return root
def DeserializeCore(self,s):
t = s[self.index]
if t.isdigit():
root = TreeNode(int(t))
self.index +=1
left = self.DeserializeCore(s)
right = self.DeserializeCore(s)
root.left = left
root.right = right
return root#这个地方必须有,没有就没构建出来节点
elif t =="#":
self.index+=1
return None
'''
def Serialize(self,root):
self.s=''
self.sarializeCore(root)
return self.s
def sarializeCore(self,root):
if root is None:
self.s+='#,'#注意要加逗号分隔
return self.s
self.s+=str(root.val)+','#注意要加逗号分隔,将数字转为str
self.sarializeCore(root.left)
self.sarializeCore(root.right)
def Deserialize(self,s):
if s is None:
return None
if len(s)==1 and s[0]=='#':
return None
self.index=0
s=s.split(',')
root=self.DeserializeCore(s)
return root
def DeserializeCore(self,s):
t=s[self.index]
if t.isdigit():
root=TreeNode(int(t))#注意转为int
self.index+=1
left=self.DeserializeCore(s)
right=self.DeserializeCore(s)
root.left=left
root.right=right
return root
elif t=='#':
self.index+=1
return None
#疯狂游戏笔试题:n个数之间的大于等于有多少种可能
#c语言代码
#include <stdio.h>
int main(){
int n;
while(scanf("%d",&n)!=EOF){
int i,j,count2[19],count[19]={0};
int sum=0;
count[1]=1;
count[2]=2;
for(i=3;i<=n;i++){
for(j=2;j<=i;j++){
count2[j]=(count[j]+count[j-1])*j;
}
for(j=2;j<=i;j++){
count[j]=count2[j];}
}
for(i=1;i<=n;i++){
sum+=count[i];
}
}
return 0;
}
#堆排序
def msort():
array=[1,2,3,4]
size=len(array)
array=sort(array,size)
return array
def sort(array,size):
for i in range(int(size/2)-1,-1,-1):
adjust(array,i,size-1)
for i in range(size-1,-1,-1):
temp=array[0]
array[0]=array[i]
array[i]=temp
adjust(array,0,i-1)
def adjust(array,start,end):
temp=array[start]
i=2*start+1
while i<=end:
if i+1<=end and array[i+1]<array[i]:
i=i+1#注意要初始化一个存储计算结果的变量,不能直接对base进行叠乘,因为直接叠乘会改变base的大小
if array[i]>temp:
break
array[start]=array[i]
start=i
i=2*start+1
array[start]=temp
#快排
def sort():
lis=[1,2,3,4]
qsort(lis,0,len(lis)-1)
def qsort(lis,low,high):
if low<high:
key=partion(lis,low,high)
qsort(lis,low,key-1)
qsort(lis,key+1,high)
def partion(lis,low,high):
keynum=lis[low]
while low<high:
while low<high and lis[high]>=keynum:
high-=1
swap(lis[high],lis[low])
while low <high and lis[low]<=keynum:
low+=1#注意要初始化一个存储计算结果的变量,不能直接对base进行叠乘,因为直接叠乘会改变base的大小
swap()
return low
#字符串的排列
def code27(s):
if len(s)==1:
return s[1]
res=[]
for i in range(len(s)):
l=code27(s[:i]+s[i+1:])
for m in l:
res.append(s[i]+m)
return res
def permutation(s):
word=list(s)
return list(sorted(set(code27(word))))
#归并排序
def merge_sort(arr,temp,s,end):
temp=[None for in in range(len(arr))]
if s<end:
mid=int((s+end)/2)
merge_sort(arr,temp,s,mid)#先分割
merge_sort(arr,temp,mid+1,end)
merge(arr,temp,s,mid,end)#然后合并
return arr
def merge(arr,temp,s,mid,end):
t=0#未被赋值,即没有符号
i=s
j=mid+1
while i<=mid and j<=end:
if arr[i]<arr[j]:
temp[t]=arr[i]
i+=1
else:
temp[t]=arr[j]
j+=1
t+=1
while i<mid:
temp[t]=arr[i]
t+=1
i+=1
while j<end:
temp[t]=arr[j]
t+=1
j+=1
t=0
while(s<=end):
arr[s]=temp[t]
s+=1#注意要初始化一个存储计算结果的变量,不能直接对base进行叠乘,因为直接叠乘会改变base的大小
t+=1
#堆排序
def sort(data):
size=len(data)
for i in range(size//2-1,-1,-1):
adjust(data,i,size-1)
for i in range(size-1,-1,-1):
temp=data[0]
data[0]=data[i]
data[i]=temp
adjust(data,0,i-1)
def adjust(data,start,end):
temp=data[start]
i=start*2+1#注意要初始化一个存储计算结果的变量,不能直接对base进行叠乘,因为直接叠乘会改变base的大小
while i<=end:
if i+1<=end and data[i+1]<data[i]:
i=i+1
if data[i]>temp:
break
data[start]=data[i]
start=i
i=start*2+1
data[start]=temp
#快速排序
def quiksort(data,low,high):
if low<high:
key=choose(data,low,high)
quiksort(data,low,key)
quiksort(data,key+1,high)
def choose(data,low,high):
keyvalue=data[low]
while low<high:
while low<high and data[high]>=keyvalue:
high-=1#注意要初始化一个存储计算结果的变量,不能直接对base进行叠乘,因为直接叠乘会改变base的大小
temp=data[low]
data[low]=data[high]
data[high]=temp
while low<high and data[low]<=keyvalue:
low+=1
temp=data[low]
data[low]=data[high]
data[high]=temp
return low
#快排
def sort(data,low,high):
if low<high:
key=qsort(data,low,high)
sort(data,low,key)
sort(data,key+1,high)
def qsort(data,low,high):
i=low
key=data[low]
while low<high:
while low<high and data[high]>=key:
high-=1#注意要初始化一个存储计算结果的变量,不能直接对base进行叠乘,因为直接叠乘会改变base的大小
swap()
while low<high and data[low]<=key:
low+=1
swap()
return low
#归并排序
def `msort(data,low,high):
temp=[None for i in range(len(data)]
if low<high:
mid=(low+high)//2
msort(data,low,mid)
msort(data,mid+1,high)
merge(data,temp,low,mid,high)
def merge(data,temp,low,mid,high):
i=low
j=mid+1
t=0
while i<=mid and j<=high
if data[i]<=data[j]:
temp[t]=data[i]
t+=1#注意要初始化一个存储计算结果的变量,不能直接对base进行叠乘,因为直接叠乘会改变base的大小
i+=1
else:
temp[t]=data[j]
t+=1
j+=1
while i<=mid:
temp[t]=data[i]
t+=1
i+=1#注意要初始化一个存储计算结果的变量,不能直接对base进行叠乘,因为直接叠乘会改变base的大小
while j<=high:
temp[t]=data[j]
t+=1
j+=1
t=0
while s<=high:
data[s]=temp[t]
s+=1
t+=1
#堆排序
def duisort(data):
for i in range(len(data)//2+1,-1,-1):
adjust(data,i,len(data)-1)
for i in range(len(data)-1,-1,-1):
temp=data[0]
data[0]=data[j]
data[j]=temp
adjust(data,0,j-1)
def adjust(data,s,end):
temp=data[s]
i=s*2+1
while i<=end:
if i+1<end and data[i+1]<data[i]:
i+=1
if data[i]>temp:
break
data[s]=data[i]
s=i
i=s*2+1
data[s]=temp