前言
谈到算法,最简单最基础的就是排序,把一个数组里面的元素进行从小到大(从大到小)排序。
排序算法有多种,最基础的是冒泡排序、快速排序、选择排序、插入排序、计数排序、归并排序,当然还有其他算法,如堆排序、希尔排序、基数排序等,这里先讲前三种排序算法。
原理
冒泡排序
一个数组中的相邻两数,进行大小比较,根据条件(比如较小数排在较大数前面),交换位置。
第一个数和第二数进行比较,第二个数和第三个数进行比较,如此循环往复。
递归算法,每一次都要从第一个数进行比较(即是前面几轮冒泡已经排出顺序,依然从头),有n个数,需要n-1冒泡。
if iList[i] >= iList[i+1]:
iList[i],iList[i+1] = iList[i+1],iList[i]
快速排序
先选取一个数作为基部,比基部小的排在左边,比基部大的排在基部右边,递归该过程,直到数组元素都为基部,合并就得到正确顺序。
选择排序
以数列中的第一个数字为基数,遍历列中的其他数字,找到最小数值,然后交换这两个数字的位置。
代码实现
import random
def randomList(n):
iList = []
for i in range(n):
iList.append(random.randrange(-100, 100))
return iList
class Sort:
def __init__(self, iList):
self.iList = iList
def result(self, name):
if name == "bubbleSort":
print("冒泡排序", self.bubbleSort(self.iList))
if name == "quickSort":
print("快速排序", self.quickSort(self.iList))
if name == "selectionSort":
print("选择排序",self.selectionSort(self.iList))
def bubbleSort(self, iList): # 冒泡排序
if len(iList) <= 1:
return iList
for i in range(1, len(iList)):
for j in range(0, len(iList) - i):
if iList[j] >= iList[j + 1]:
iList[j], iList[j + 1] = iList[j + 1], iList[j]
return iList
def quickSort(self, iList): # 快速排序
left = []
right = []
if len(iList) <= 1:
return iList
for i in iList[1:]:
if i <= iList[0]:
left.append(i)
else:
right.append(i)
return self.quickSort(left) + [iList[0]] + self.quickSort(right)
def selectionSort(self, iList): # 选择排序
if len(iList) <= 1:
return iList
for i in range(0, len(iList) - 1):
if iList[i] != min(iList[i:]):
mindex = iList.index(min(iList[i:]))
iList[i], iList[mindex] = iList[mindex], iList[i]
return iList
if __name__ == "__main__":
iList = randomList(10)
print(" 排序前 ",iList)
s = Sort(iList)
s.result("quickSort")
s.result("bubbleSort")
s.result("selectionSort")
总结
冒泡排序时间复杂度:O(n^2)
选择排序时间复杂度:O(n^2),在Python中为O(n)
快速排序时间复杂度:O(n Log n)~O(n^2)