pta通讯录排序用python实现_用python实现经典排序

1、冒泡排序

算法原理:

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

def Bubble_list(self,list):

mlen = len(list)

while mlen>1:

index = 0

for r in range(mlen):

if list[index] > list[index + 1]:

list[index], list[index + 1] = list[index + 1], list[index]

index = index + 1

if index == mlen - 1:

break

mlen = mlen - 1

return list

更新于2019-12-2:

def bubble(list_a):

for j in range(len(list_a) - 1):

list_b = list_a[:len(list_a) - j]

for i in range(len(list_b) - 1):

if list_a[i] > list_a[i + 1]:

list_a[i], list_a[i + 1] = list_a[i + 1], list_a[i]

return list_a

2、选择排序

算法原理:

1、初始时在序列中找到最小(大)元素,放到序列的起始位置作为已排序序列;

2、再从剩余未排序元素中继续寻找最小(大)元素,放到已排序序列的末尾。

3、以此类推,直到所有元素均排序完毕。

#简易思路是:对于list中第i个数,找出i~len(list)-1中最小的数,并于第i个数交换位置,此次循环结束后,再寻找i+1~len(list)-1中最小的数,并于第i+1个数交换位置,以此类推

def select_sort(self,list):

'''选择排序'''

for i in range(len(list)):

min = i

for r in range(i,len(list)):

if list[min] > list[r + 1]:

min = r+1

if r == len(list) - 2:

break

list[i],list[min]=list[min],list[i]

if i == len(list) - 2:

break

return list

更新于2019-12-2:

def select(list_a):

for j in range(len(list_a)-1):

min_number = list_a[j]

for i in range(j, len(list_a)):

if list_a[i] < min_number:

min_number = list_a[i]

list_a[j], list_a[i] = list_a[i], list_a[j]

return list_a

3、插入排序

算法原理:

1、从第一个元素开始,该元素可以认为已经被排序

2、取出下一个元素,在已经排序的元素序列中从后向前扫描

3、如果该元素(已排序)大于新元素,将该元素移到下一位置

4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

5、将新元素插入到该位置后

6、重复步骤2~5

插入排序分为;直接插入排序、二分法插入排序、链表插入排序、希尔排序

直接插入排序:

def Insert_sort_directly(self,list):

'''直接插入排序'''

for r in range(1,len(list)):

i=r

while list[r]

i=i-1

if i==0:

break

list.insert(i,list[r])

del list[r+1]

return list

更新于2019-12-2

def insert():

'''直接插入排序'''

for i in range(1, len(list_a)):

for j in (0,i):

if list_a[i]<=list_a[j]:

list_a.insert(j,list_a[i])

del list_a[i+1]

return list_a

二分法插入排序:

def Insert_sort_division(self,list):

'''二分法插入排序'''

if list[0]>list[1]: #由于二分法是在两个数的情况下比较,因此首先给list中前两位数排序

list[0],list[1]=list[1],list[0]

for r in range(2,len(list)):

i=r

lindex=0 #左边界

rindex=i-1 #右边界

while rindex-lindex!=1: #判断list[r]的区间,直至左边界和右边界为邻近边界

mindex=(lindex+rindex)/2

if list[r]>list[mindex]:

lindex=mindex

else:

rindex=mindex

if list[r]

list.insert(lindex,list[r])

elif list[r]>list[rindex]:

list.insert(rindex+1, list[r])

else:

list.insert(rindex,list[r])

del list[r+1]

return list

希尔排序:

先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分成若干组子序列,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1,最后使用直接插入排序完成排序。

def Insert_sort_shell(self,list):

'''希尔排序'''

def form_list(d,list):

'''将list按照增量d分割成若干个子序列'''

allList=[]

for r in range(d):

i=r

sublist = []

while i

sublist.append(list[i])

i=i+d

allList.append(sublist)

return allList

def sublist_sort(allList):

'''对每个子序列进行排序并还原原序列'''

list=[]

# 对子序列进行排序

for r in allList:

self.Insert_sort_directly(r)

#还原原来序列

i=0

while i

for r in allList:

if i > len(r) - 1:

continue

list.append(r[i])

i = i + 1

return list

d=len(list)/2

while d!=0:

allList=form_list(d,list)

list=sublist_sort(allList)

d=d/2

return list

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值