版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录
第10章排序....................................................................2
10.2插入排序...............................................................2
10.2.1直接插入排序......................................................2
10.2.2折半插入排序.....................................................2
10.2.3希尔排序..........................................................3
10.3交换排序...............................................................3
10.3.1冒泡排序..........................................................3
10.3.2快速排序.........................................................4
10.4选择排序...............................................................4
10.4.1简单选择排序.....................................................4
10.4.2堆排序............................................................5
10.5归并排序...............................................................6
10.8实例....................................................................7
10.8.1插入一值保持有序不变.............................................7
10.8.2最小的K个数.....................................................8
第10章排序
10.2插入排序
插入排序将无序子序列中的一个或几个记录插入到有序序列中,从而减少无序子序列,
增加记录的有序子序列的长度。插入排序又可细分为直接插入排序、折半插入排序和希尔排
序。
10.2.1直接插入排序
【直接插入排序代码】
definsert_sort(alist):
foriinrange(l,len(alist)):#外循环n・l
forjinrange(i,0,-l):#内循环
ifalist[j]<alistfj-l]:
alist[j],alist[j-l]=alist[j-l],alist[j]#元素交换
Ii=[59,l2,77,64,72,69,46,89,31,9]
print('before:\li)
insert_sort(li)
print(*after:'Ji)
【程序运行结果】
before:[59,12,77,64,72,69,46,89,31,9]
after:[9,12,31,46,59,64,69,72,77,89]
10.2.2折半插入排序
【折半插入排序代码】
defbinary_sort(a):
foriinrange(0,len(a)):
index=a[i]
low=0
hight=i-1
whilelow<=hight:
mid=(low+hight)//2
ifindex>a[mid]:
low=mid+1
else:
hight=mid-1
forjinrange(i,low,-1):
a[j]=a[j-1]
a[low]=index
li=[59,l2,77,64,72,69,46,89,31,9]
print('before:\li)
binary_sort(li)
print('after:\li)
程序运行结果如下:
before:[59,12,77,64,72,69,46,89,31,9]
after:[9,12,31,46,59,64,69,72,77,89]
10.2.3希尔排序
【希尔排序代码】
defshell_sort(alist):
n=len(alist)
gap=n//2
whilegap>0:
foriinrange(gap,n):
j=i
whilej>=gapandalist|j-gap]>alist[jj:
alist[j-gap],alist[j]=alist[j],alistU-gap]
j-=gap
gap=gap//2
li=[l1,9,84,32,92,26,58,91,35,27,46,28,75,29,37,12]
print(*before:*,li)
shell_sort(li)
print('after:\li)
【程序运行结果】
before:[11,9,84,32,92,26,58,91,35,27,46,28,75,29,37,12]
after:[9,11,12,26,27,28,29,32,35,37,46,58,75,84,91,92J
10.3交换排序
10.3.1冒泡排序
【冒泡排序代码】
defbubble_sort(alist):
forjinrange(len(alist)-1,0,-1):#外循环
foriinrange(j):#内循环
ifalist[i]>alist[i+l]:
alist[i],alist[i+l]=alist[i+l],alist[i]
li=[54,26,93,l7,77,31,44,55,20]
printCbefore:\li)
bubble_sort(li)
print('after:*,li)
【程序运行结果】
before:[54,26,93,17,77,31,44,55,20]
after:[17,20,26,31,44,54,55,77,93]
10.3.2快速排序
【快速排序代码】
defquick_sort(alist,start,end):
ifstart>=end:
return
mid=alist[startj
low=start
high=end
whilelow<high:
whilelow<highandalist[high]>=mid:
high-=1
alist[low]=alist[high]
whilelow<highandalist[low]<mid:
low+=1
alist[high]=alist[low]
alist[low]=mid
quick_sort(alist,start,low-l)
quick_sort(alist,low+l,end)
li=[48,36,61,99,81,14,30]
printCbefore/Ji)
quick_sort(li,0,len(li)-1)
printCafter:',li)
【程序运行结果】
before:148,36,61,99,81,14,30]
after:[14,30,36,48,61,81,99]
10.4选择排序
10.4.1简单选择排序
【简单选择排序代码】
defselection_sort(alist):
n=len(alist)
foriinrange(0,n):
min=i#将当前下标定义为最小值下标
forjinrange(i+l,n):
ifalist[j]<alistfmin]:#如果有小于当前最小值的关键字
min=j#将此关键字的下标赋值给min_index
alist[i],alist[min]=alist[min],alist[i]
li=[5,2,l,8,3,4,6,7]
print('before:',li)
selection_sort(li)
printCafter:',!!)
【运行结果】
before:[5,2,1,8,3,4,6,7]
after:[1,2,3,4,5,6,7,8]
10.4.2堆排序
【堆排序完整代码如下所示】
fromcollectionsimportdeque
defswap_param(L,i,j):#把堆顶元素和堆末尾的元素交换
L[i],LU]=LU],L[i]
returnL
defheap_adjust(L,start,end):#调整为大根堆
temp=L[start]
i=start
j=2*i
whilej<=end:#代表在调整完整棵树树之前一直进行循环
if(j<end)and(L[j]<L[j+1]):#保证j取到较大子树的坐标
j+=I
iftemp<L|j]:#如果子树的根节点小于子树的值,就把根节点和较大的子树的值进行交换
L[i]=Uj]
i=j
j=2*i
else:
break
L[i]=temp
defheap_sort(L):
LJength=len(L)-1#引入一个辅助空间
first_sort_count=L_length//2
foriinrange(first_sort_count):#把序列调整为一个大根堆
heap_adjust(L,first_sort_count-i,L_length)
foriinrange(L_length-1):
L=swap_param(L,1,L_length-i)
#交换第一个节点和最后一个节点的值(引入的一个辅助空间,序列长度减1)
heap_adjust(L,1,LJength-i-1)
return[L[i]foriinrange(1,len(L))]
defmain():
L=deque([50,16,30,10,60,90,2,80,70])
L.appendleft(O)
print(heap_sort(L))
if_name_=='_main_
main()
程序运行结果为:
[2,10,16,30,50,60,70,80,90]
方法二:使用heapq模块实现,heapq模块见附录C
importheapq
defheapsort(iterable):
h=[]
forvalueiniterable:
heapq.heappush(h,value)
return[heapq.heappop(h)foriinrange(len(h))]
if_name_=='_main—
li=[l,3,5,7,9,2,4,6,8,0]
print(nbefore:"Ji)
h=heapsort(li)
print("after:",h)
【程序运行结果】:
before:[1,3,5,7,9,2,4,6,8,0]
after:[0,1,2,3,4,5,6,7,8,9]
10,5归并排序
【归并排序法代码】
defmerge(left,right):
i,j=0,0
result=[]
whilei<len(Ieft)andj<len(right):
ifleft[i]<right[j]:
result.append(left[i])
i+=l
else:
result.append(right[j])
j+=l
result.extend(left[i:])
result.extend(right[j:])
returnresult
defmerge_sort(alist):
iflen(alist)<=l:
returnalist
mid=len(alist)//2
left=merge_sort(alist[:mid])
right=merge_sort(alist[mid:])
returnmerge(left,right)
defmain():
li=[9,4,6,2,l,7]
print("befroe:n,li)
print(nafter:n,merge_sort(li))
if_name_=='_main_
main()
【程序运行结果】
befroe:[9,4,6,2,1,7]
after:[1,2,4,6,7,9]
10.8实例
10.8.1插入一值保持有序不变
【例10-1】实现有序序列中插入一个值,保持序列有序不变。
【解析】:假设有序序列为(1,2,7,8,49),插入6,输出(1,2,6,7,8,49)升序。
步骤1:确定插入的位置。组(1,2,7,8,49)中找到6所要插入的位置,其位置为2
和7之间的位置,6要插入的位置是元素7所在的位置。
步骤2:依次移位,腾出空位。直接将6插入到7所在的位置,7将被覆盖,因此需要
给6腾出位置。从序列末尾开始,元素依次往其后的位置移动,49往后移动,8移到49原
先的位置上,7移到8原先的位置上。
步骤3:插入6。将数据6插入原先7所在位置。
根据例10-1的提示,针对给定序列a[0…n-1],直接插入排序算法如下所示:
步骤1:初始时,a[0]自成1个有序区,无序区为a[l..n-l];
步骤2:第2个元素与列表中左侧的第1个元素比较,如果则交换位置,
结果是左侧的两个元素排好序。
步骤3:以此类推,将a[i]并入前面排好序的子序列a[0…i-l]中形成a[0…i]的有序区间;
步骤4:进行n-1轮比较和交换后,列表中的所有元素均按递增顺序排序
10.8.2最小的K个数
【例10。】输入n个整数,找出其中最小的K
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年荆州市江陵县一级造价工程师《土建计量》押题密卷含解析
- 课程设计机械原理精压机
- 钱包课程设计思路
- 乐器零售业的季节性营销考核试卷
- 原油加工新技术的研发与工业化应用考核试卷
- 道路运输服务品质管理考核试卷
- 稀有金属矿选矿厂安全教育与培训体系构建考核试卷
- 公路养护工程养护工程绿色施工考核试卷
- 船舶燃油消耗监测系统的数据解读与应用考核试卷
- 稀土金属冶炼与市场动态分析考核试卷
- 仪器设备损坏、故障、改装或维修记录表
- 部编版语文一年级上册第二单元大单元作业设计
- You-can-play-football-well-课件(省一等奖)
- 各级医疗机构(医院)更年期保健特色专科评估标准
- 神经系统变性病课件
- 学四史之新中国史课件全文
- 古代汉语常用工具书课件
- 汉密尔顿焦虑量表HAMA(14项打印版)
- 部门预算编制培训课件
- 小学人教四年级数学《沏茶问题》课件
- 学校食堂廉政风险责任书
评论
0/150
提交评论