快排
选一个元素做基准,将无序区划分为两个。使左边的都比基准小,右边都比基准大。当左右两个区域均为非空时,分别对它们进行划分。
法一(选第一个为基准)
如[49,38,65,97,76,13,27,49]
选49为x。
j从左向右扫描,找到第一个小于x的元素27,j=6,x被a[j]替代[27,38,65,97,76,13,27,49]
i从右向左扫描,找到第一个大于x的元素65,i=2,a[j]被a[i]替代
[27,38,65,97,76,13,65,49]
j向右扫描,找到13,j=5,a[i]被a[j]替代
[27,38,13,97,76,13,65,49]
i从左向右扫描,找到97,i=3,a[j]被a[i]替代
[27,38,13,97,76,97,65,49]
j从右向左扫描,直到i=j,将x赋值给ai
第一次结束 [27,38,13]49[76,97,65,49]
第二次[13]27[ 38] 49[ 49, 65]76[ 97]
第三次
13, 27, 38, 49, 49[ 65]76, 97
def partion (a,l,r):
i=l
j=r
x=a[i]#基准
while i<j:
while a[j]>=x and i<j:
#从右向左扫描,找第一个小于基准的数
j=j-1
#若找到
if i<j:
a[i]=a[j]#与其余两个语句共同完成交换的任务
i=i+1
while a[i]<=x and i<j:
#从左向右找第一个大于基准的元素
i=i+1
#若找到
if i<j:
a[j]=a[i]#与其余两个语句共同完成交换的任务
j=j-1
a[i]=x#与其余两个语句共同完成交换的任务
return i#返回基准的位置
def sort(a,left,right):
if left <right:#为空或只有一个元素不要排序
i=partion(a,left,right)#划分
sort(a,left,i-1)
sort(a,i+1,right)
return a
引用块内容
法二(选最后一个元素为基准)
数组被分成了三个部分(分别用灰色,黑色,白色表示),其中i和j就是分割线,并且浅灰部分的元素均比A[r]小,黑色部分的元素均比A[r]大
def partion(a,l,r):
i=l-1
x=a[r]
for j in range(l,r-1):
if a[j]<=x:
i=i+1
a[j],a[i]=a[i],a[j]
a[i+1],a[r]=a[r],a[i+1]
return i+1
def sort(a,left,right):
if left<right:
i=partion(a,left,right)
sort(a,left,i-1)
sort(a,i+1,right)
基数排序 每个数从个位开始,按位放在0-9九个桶里。 每次结束后合并桶(按之前桶的顺序排列),然后按更高的位再放入不同桶里,再合并。。。
t=max(a)
d=len(str(t))#最大数的位数
for j in range(d):
s=[[] for q in range(10)]
for r in a:
s[r//10**j%10] .append(r)#每个桶分别赋值
a=[j for i in s for j in i]#桶合并
return a
归并排序
def merge_sort(nums):
lens = len(nums)
count = lens
n = 2
def sort_two_list(list1,list2):
len1 = len(list1)
len2 = len(list2)
list3 = []
i,j=0,0
while i<len1 and j<len2:
if list1[i] < list2[j]:
list3.append(list1[i])
i += 1
else:
list3.append(list2[j])
j += 1
list3 += list1[i:]
list3 += list2[j:]
return list3
for i in range(0,lens-1,2):/先把相邻两个两两排序
if nums[i] > nums[i+1]:
nums[i],nums[i+1] = nums[i+1],nums[i]
while n<=lens:
list3 = []
for j in range(0,lens,2n):
list3 += sort_two_list(nums[j:j+n],nums[j+n:j+2n])/每次排好2n个数
nums = list3
n += n
return nums
print(merge_sort([43,23,43,23,34,6]))
注1.当索引的下表超过序列的大小
a=[1,2]
b=a[5:6]
print(b)
python中结果为[ ]