数据结构学习1:简单排序之冒泡排序和插入排序原理及Python实现

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]上的元素一定是已经有序的了。


(2) Python实现代码:以升序插入排序为例
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

猜你喜欢

转载自blog.csdn.net/zhuzuwei/article/details/80583416