排序算法,目前只实现了七种,后续慢慢会补上~~各位多指教
分别为:
1. 选择排序
2. 插入排序
3. 冒泡排序
4. 归并排序
5. 快速排序
6. 基数排序
7. 计数排序
另外还有希尔,堆,桶排序,以及各种算法的改进版本,需要去处理下
直接贴代码
- # file :sort.py
- import math
- class sort:
- def selectSort(self,L):
- size = len(L)
- for i in range(0,size):
- max=L[i]
- index = i
- for j in range(i,size):
- if L[j] > max:
- max=L[j]
- index=j
- temp = L[i]
- L[i]=max
- L[index]=temp
- print(L)
- def insertSort(self,L):
- size = len(L)
- for i in range(1,size):
- fv = L[i]
- j = i
- while(j>=1):
- if fv < L[j-1]:
- L[j] = L[j-1]
- else:
- break
- j=j-1
- L[j] = fv
- print(L)
- def bubbleSort(self,L):
- size = len(L)
- for i in range(size-1,-1,-1):
- for j in range(0,i-1):#这里需要注意下,重新看下是否符合,感觉怪怪的
- if L[j]>L[j+1]:
- temp = L[j]
- L[j]=L[j+1]
- L[j+1] = temp
- print(L)
- def merge(self,L1,L2):
- L=[]
- index1 = 0
- index2 = 0
- size1 = len(L1)
- size2 = len(L2)
- top = min(size1,size2)
- while(index1!=size1 and index2!=size2 ):
- if L1[index1] > L2[index2]:
- L.append(L2[index2])
- index2 = index2 + 1
- else:
- L.append(L1[index1])
- index1 = index1 + 1
- if index1 < size1:
- for i in range(index1,size1):
- L.append(L1[i])
- if index2 < size2:
- for i in range(index2,size2):
- L.append(L2[i])
- return L
- def mergeInL(self,L,first,mid,last):
- tempa = []
- tempb = []
- for i in range(first,mid+1):
- tempa.append(L[i])
- for i in range(mid+1,last+1):
- tempb.append(L[i])
- tempc = self.merge(tempa,tempb)
- index = 0
- for i in range(first,last+1):
- L[i] = tempc[index]
- index += 1
- #我错了。。。本来两个方法,写着写着变三个方法,改天再改
- def mergeSort(self,L,first,last):
- #print("1first = %d last = %d" %(first,last))
- if first < last:
- #print("2first = %d last = %d"%(first,last))
- mid = math.trunc((first+last)/2) #必须拿到整数,晕死
- self.mergeSort(L,first,mid)
- self.mergeSort(L,mid+1,last)
- self.mergeInL(L,first,mid,last)
- #代码简洁效率高~~改天实现改进版的
- def quickSort(self,L,left,right):
- i = left
- j = right
- middle = L[left]
- while i<=j:
- while L[i]<middle and i<right:
- i += 1
- while L[j]>middle and j>left:
- j -= 1
- if i<=j: #命中一对
- temp = L[i]
- L[i] = L[j]
- L[j] = temp
- i += 1
- j += 1
- if left<j:
- self.quickSort(L,left,j)
- if right > i:
- self.quickSort(L,i,right)
- def __bucketInit(self):
- l0 = []
- l1 = []
- l2 = []
- l3 = []
- l4 = []
- l5 = []
- l6 = []
- l7 = []
- l8 = []
- l9 = []
- bucket = [l0,l1,l2,l3,l4,l5,l6,l7,l8,l9]
- return bucket
- #基数排序
- def radixSort(self,L):
- radix = 10
- base = 1
- bucket = self.__bucketInit()
- max = L[0]
- for i in L:
- if i > max:
- max = i
- while math.trunc((max%radix)/base) > 0:
- #放到桶里
- for i in L:
- index = math.trunc((i%radix)/base)
- bucket[index].append(i)
- #重新整理回L
- L = []
- for i in bucket:
- L.extend(i)
- bucket = self.__bucketInit()
- print(L)
- #下一轮循环取下一位
- radix *= 10
- base *=10
- return L
- #计数排序
- def countSort(self,L):
- size = len(L)
- min = max = L[0]
- #拿到最大和最小
- for i in L:
- if i<min:
- min = i
- if i>max:
- max = i
- #得到数字的区间
- bound = max - min +1
- #初始化计数数组
- count =[]
- for i in range(0,bound):
- count.append(0)
- #统计每个数出现的次数,放到count中
- for i in range(0,size):
- count[ L[i]-min ] +=1
- z = 0
- print("min = %d and max = %d"%(min,max))
- for i in range(min,max+1):
- #print("i="+str(i))
- for j in range(0,count[i-min]):#count[i-min]表示该数字出现次数,0次地话不处理,多次的话依次插入
- #print("j="+str(j))
- L[z] = i
- print(L)
- z+=1
- print(L)
- a = sort()
- l = [3,2,5,7,1,9]
- print('原始数组')
- print(l)
- print('选择排序')
- a.selectSort(l)
- l2 = [3,2,5,7,1,9]
- print('插入排序')
- a.insertSort(l2)
- print('冒泡排序')
- l3 = [3,2,5,7,1,9]
- a.bubbleSort(l3)
- print('列表归并算法 没有问题')
- la = [1,3,5,7,9,11]
- lb = [2,4,6,8]
- print(a.merge(la,lb))
- print('归并排序')
- lm = [3,2,5,7,1,9]
- a.mergeSort(lm,0,5)
- print(lm)
- print('快速排序')
- lq = [3,2,5,7,1,9]
- a.quickSort(lq,0,5)
- print(lq)
- print('基数排序')
- lr = [3,20,5,713,1,9]
- print(lr)
- a.radixSort(lr)
- print("计数排序")
- lz = [3,2,5,7,1,9]
- a.countSort(lz)
运行结果: