1. 冒泡排序
(1)原理:比较相邻的两个元素,将值大的元素交换到右边(降序则相反)。
(2) 步骤:
a. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
b. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
c. 针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
(3)Python实现代码:以升序冒泡排序为例
def popSorting(dataList): "利用python实现冒泡排序, 传入无序列表(元素为int或float),返回有序列表, 默认从小到大" k = 0 # 计数器,测试使用,每交换一次元素,k值加1 for j in range(len(dataList) - 1,0,-1): # 遍历原始数据 flag = 0 # 执行下一趟冒泡排序时就可以不考虑末尾已排好序的最大值 for i in range(j): # 一趟冒泡,每一趟冒泡均可保证最大值能排到列表末尾, if dataList[i] > dataList[i+1]: # 比较相邻元素大小,视情况交换两元素的值 temp = dataList[i] dataList[i] = dataList[i+1] dataList[i + 1] = temp flag = 1 # 标志发生交换 k += 1 if flag == 0: # 如果某次遍历中,全程都没有发生交换,则停止 break print("共交换了",k,"次元素值") return dataList list1 = [34,8,64,51,32,31] sorted_list = popSorting(list1) print(sorted_list) 共交换了 9 次元素值 [8, 31, 32, 34, 51, 64]
2. 插入排序
(1)原理和步骤
插入排序算法有种递归的思想在里面,它由N-1趟排序组成。
a. 初始时,只考虑数组下标0处的元素,只有一个元素,显然是有序的。
b. 然后第一趟: 对下标 1 处的元素进行排序,保证数组[0,1]上的元素有序;
c. 第二趟 : 对下标 2 处的元素进行排序,保证数组[0,2]上的元素有序;
.....
d. 第i 趟: 对下标 i 处的元素进行排序,保证数组[0,i-1]上的元素有序,具体做法是,从i-1处的元素开始到第0个元素,与第i 处的元素比较大小,如果前者较大,则将前者后移一个位置,直到出现后者较大的情况,即第j个元素大于第i个元素,则将第i个元素插入到第j个位置。
.....
e. 第N-1趟对下标: N-1 处的元素进行排序,保证数组[0,N-1]上的元素有序,也就是整个数组有序了。
它的递归思想就体现在:当对位置 i 处的元素进行排序时,[0,i-1]上的元素一定是已经有序的了。
def insertSorting(dataList): "利用python实现插入排序, 传入无序列表(元素为int或float),返回有序列表, 默认从小到大" k = 0 # 计数器,测试使用,每交换一次元素,k值加1 for j in range(1,len(dataList)): # 遍历原始数据 temp = dataList[j] for i in range(j,1,-1): if dataList[i-1] >temp: # 比较元素和待插入值的大小,视情况交换两元素的值 dataList[i] = dataList[i-1] # 移除空位 k += 1 else: dataList[i-1] = temp # 新值落位 print("共交换了", k, "次元素值") return dataList list1 = [34,8,64,51,32,31] sorted_list2 = insertSorting(list1) print(sorted_list) 共交换了 9 次元素值 [8, 31, 32, 34, 51, 64]
3. 时间复杂的分析:
4. 空间复杂度:算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数,与问题的规模没有关系。算法的空间复杂度S(n)定义为该算法所耗费空间的数量级。
显然,冒泡排序和插入排序占用的空间是定量的,与N无关,空间复杂度为O(1),即为常数。
参考文献:http://baijiahao.baidu.com/s?id=1585931471155461767&wfr=spider&for=pc
https://blog.csdn.net/doublelions/article/details/6402626