python——排序
从学校毕业出来后只知道冒泡排序,发现自己对排序的了解还是很浅显。
于是在网上搜索各种排序方法,以下是本人根据索搜出来的资料再结合自己理解作出的一些简单的阐述。
如果有不正确的地方欢迎大家指正。(共同学习,共同进步)
1、插入排序:最优为O(n),最坏为O(n^2),平均O(n^2)
(1)始终定义第一个元素为有序的,将剩余元素逐个插入到这个有序列中。
(2)插入过程中,将需要插入的元素与有序列中的元素逐个比较,插入到适当位置
python:
def InserSort(lists): count = len(lists) for i in range(1,count): key = lists[i] #需要插入的元素 index = i #记录插入的位置 while index>0 and lists[index-1]>key: #逐个比较,若小于前一个数则将该元素向前移动位置 lists[index] = lists[index-1] index -= 1 #将需要插入的元素,插入指定位置 lists[index] = key return lists
2、冒泡排序:最优为O(n),最坏为O(n^2),平均O(n^2)
(1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(3)针对所有的元素重复以上的步骤,除了最后一个。
(4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
python:
def BubbleSort(lists): count = len(lists) for i in range(count): for j in range(count-i-1): if lists[j] > lists[j+1]: lists[j],lists[j+1]=lists[j+1],lists[j] #前后替换 return lists
3、希尔排序:(实质上是分组插入排序)
(1)取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中
(2)各组内进行直接插入排序
(3)取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 =1,即所有记录放在同一组中进行直接插入排序为止。
def ShellSort(lists): count = len(lists) group = count // 2 while group>0: for i in xrange(count): index =i j = i+1 while j<count: if lists[j]<lists[index]: index = j j += group if index != j: lists[index],lists[i]=lists[i],lists[index] group = group //2 return lists
4、快速排序:最有O(NlogN)
(1)设置两个变量i,j,排序开始的时候i=0,j=n-1。
(2)以数组第一个元素作为基数,key=A[0]。
(3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于或者等于key的值。
(4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于或者等于key的值。
(5)将第3步和第4步找到的数互换位置。
(6)重复3、4、5步骤, 直到i==j,将基数与A[i]互换。此时与A[i]为界分为两个区。
(7)将两个区重复3、4、5、6步骤
python
def quickSort(lists,left,right): if left >= right: return lists #设置基数 key = lists[left] i = left j = right while i < j: #从列表右边开始找比基数小或者相等的数 while i < j and lists[j] >= key: j = j-- #从列表左边开始找比基数大或者等于的数 while i < j and lists[i] <= key: i = i++ if i < j: lists[i],lists[j]=lists[j],lists[i] #做完第一轮比较,列表分成2个去,并且i=j,将这个数设置回基数 lists[left] = lists[i] lists[i] = key #递归前后半区 重复上述操作 quickSort(lists,left,i-1) quickSort(lists,j+1,right) return lists
5、箱排序:O(m+n)
(1)设置若干个箱子,依次扫描待排序的记录R[0],R[1],…,R[n-1]
(2)把关键字等于k的记录全都装入到第k个箱子里(分配)
(3)然后按序号依次将各非空的箱子首尾连接起来(收集)。
python
def barrelSort(lists): #选择一个最大的数 maxnum=max(lists) #创建一个元素全是0的列表,作为箱 bucket = [0]*(maxnum+1) #把所有元素放入箱中,对应元素个数加1 for i in lists: bucket[i] +=1 #存储排序好的元素 sort_lists=[] #取出箱中的元素 for j in range(len(bucket)): if bucket[j] != 0: for n in range(bucket[j]): sort_lists.append(j) return sort_lists