一、冒泡排序
我们来看下面这个程序:
range(len(alist)-1,0,-1) 第一个参数是起始值,第二个参数是终止值,第三个参数是步长
也就是生成0到len(alist)-1的数字,然后按照步长-1就是从大到小取值
比如说range(10,5,-1) 第一次取10第二次取9第三次取8...最后一次也就是第五次取6(取不到5)
第一次排序的时候我们需要比较数列长度len(alist)-1次,一个数列有n个数,我们需要拿它里面的数两个两个比较的话一共有n-1对
数列中一共有7个数,1和4比较 4大 取4;然后4和7比较 7大 取7;7和3比较 7大 取7;7和6比较 7大 取7;7和9比较 9大 取9;9和9比较 9大 取9; 最后把9放在最后一位,第一次排序选出最大的数放在最后一位。
第二次排序类似于上面第一次一样两个两个比较,取大的和后面的比较...到最后的时候不用和最后一位比较了,因为9是最大的已经放在最后一位了,所以只需要和倒数第二位比较就可以了。for i in range(item)已经帮我们做了这件事,每次排序比较的对数每次都会减一。
#Python的冒泡排序 alist = [1,4,7,3,6,9,5] def func(alist): for item in range(len(alist)-1,0,-1): for i in range(item): if alist[i]>alist[i+1]: # 如果前一个数(a)比后一个数(b)大 mid = alist[i] # 把大数赋给中间变量(mid) alist[i] = alist[i+1] # 把b(小数)放在前一个数(a)大数的位置上 alist[i+1] = mid # 把中间变量存的大数放在b的位置上 完成一次排序 return alist
二、插入排序
第一次i循环 l[0]依次和后面的6个数比较,小的数放在l[0]的位置上 第二次i循环 l[1]依次和后面的5个数比较,小的数放在l[1]的位置上 第三次i循环 l[2]依次和后面的4个数比较,小的数放在l[2]的位置上 第四次i循环 l[3]依次和后面的3个数比较,小的数放在l[3]的位置上 第五次i循环 l[4]依次和后面的2个数比较,小的数放在l[4]的位置上 第六次i循环 l[5]依次和后面的1个数比较,小的数放在l[5]的位置上 l = [34, 16, 78, 2, 34, 56, 5] for i in range(len(l)-1): # 大循环6次 for j in range(i+1, len(l)): # 第一次range(1,6) 第二次range(2,6) 第三次range(3,6) ... if l[i] > l[j]: l[i], l[j] = l[j], l[i] print(l)
三、选择排序
第一次i等于6时 l[0]和它后面6个数比较,取大值得索引值,内层循环结束后然后把大值放在l[6]的位置 第二次i等于5时 l[0]和它后面5个数比较,取大值得索引值,内层循环结束后然后把大值放在l[5]的位置 第三次i等于5时 l[0]和它后面4个数比较,取大值得索引值,内层循环结束后然后把大值放在l[4]的位置 第四次i等于5时 l[0]和它后面3个数比较,取大值得索引值,内层循环结束后然后把大值放在l[3]的位置 第五次i等于5时 l[0]和它后面2个数比较,取大值得索引值,内层循环结束后然后把大值放在l[2]的位置 第六次i等于5时 l[0]和它后面1个数比较,取大值得索引值,内层循环结束后然后把大值放在l[1]的位置 l = [34, 16, 78, 2, 34, 56, 5] for i in range(len(l) - 1, 0, -1): # i依次取值为 6 5 4 3 2 1 maxindex = 0 for j in range(1, i+1): #range(1,7) range(1,6) range(1,5) range(1,4) range(1,3) range(1,2) range(1,1) if l[j] > l[maxindex]: maxindex = j l[i], l[maxindex] = l[maxindex], l[i] print(l)
四、二分查找
def binary_search(alist, item): """二分查找 非递归方式""" start = 0 end = len(alist) - 1 while start <= end : mid = (start + end) //2 if alist[mid]==item: return '你查找的数:%s ,位于列表中第%s位'%(item,mid+1) elif alist[mid] > item: end = mid - 1 elif alist[mid] < item: start = mid + 1 return 'sorry 你查找的数不在列表里' print(binary_search([1,2,3,34,56,57,78,87],56))
五、快排算法
#方法一 import time,random def quickSort(arr): less = [] pivotList = [] more = [] if len(arr)<1: return arr else: pivolt = arr[0] for i in arr: if i<pivolt: less.append(i) elif i>pivolt: more.append(i) else: pivotList.append(i) less = quickSort(less) more = quickSort(more) return less + pivotList + more start = time.time() res = [ i for i in range(1000)] random.shuffle(res) res = quickSort(res) stop = time.time() print(stop-start)
import random list1 = [2, 3, 8, 4, 9, 5, 6] list2 = [5, 6, 10, 17, 11, 2] def qsort(L): if len(L)<2:return L pivot_element=random.choice(L) small=[i for i in L if i<pivot_element] large=[i for i in L if i>pivot_element] return qsort(small)+[pivot_element]+qsort(large) a=qsort(list1+list2) print(a) # [2, 3, 4, 5, 6, 8, 9, 10, 11, 17]