第二章:排序基础

作者: fxqp1043 | 来源:发表于2019-03-30 17:31 被阅读0次

选择排序算法(selectionSort)

算法思想:

(直白描述)
1. 找出所有元素中的最小值,与第一个位置的元素互换。
2. 找出剩下的元素中的最小值,与第二个位置的元素互换。
3. 以此类推。

(形式化描述)
重复(元素个数-1)次
    # 从0开始
    把第一个没有排序过的元素设置为最小值
    遍历每个没有排序过的元素
        如果元素 < 现在的最小值
        将此元素设置成为新的最小值
    将最小值和第一个没有排序过的位置交换

算法图示:

选择排序.gif
Python使用函数实现:
def selectionSort(arrList):
    '''
    选择排序
    :param arrList:可迭代对象
    :return:
    '''
    for i in range(0, len(arrList)):
        # 寻找[i, len(arrlist))区间的最小值
        minIndex = i
        for j in range(i+1, len(arrList)):

            if arrList[j] < arrList[i]:
                minIndex = j

        # 交换i位置和最小值
        # 注意双向交换
        arrList[i], arrList[minIndex] = arrList[minIndex], arrList[i]

# 测试
a = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
selectionSort(a)

print(a)    
# 输出
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

使用模板(泛型)编写算法:
随机生成算法测试用例:
测试算法性能


插入排序算法(insertionSort)

算法思想:

(直白描述)
1.当只考虑第一个元素的时候,它已经排好序了,第一个元素不动。
2.寻找第二个元素合适的位置,把它和第一个元素比较,如果小于第一个元素,交换,否则,它的位置是合适的,继续下一次循环。
3.寻找第三个元素合适的位置,先和第二个元素比较,如果小于第二个元素,和第二个元素交换位置,然后和第一个元素比较,如果小于第一个元素,和第一个元素交换位置,继续下一次循环。

Python使用函数实现:

def insertionSort(arrList):
    # 从1开始,第0个元素已经有序
    for i in range(1, len(arrList)):
        # 寻找arrList[i]合适的插入位置
        for j in range(i, 0, -1):
            # 如果当前位置元素比前一个位置元素小,交换
            if arrList[j] < arrList[j-1]:
                arrList[j-1], arrList[j] = arrList[j], arrList[j-1]
            # 否则,当前元素位置合适,寻找下一个元素的合适位置
            else:
                break

a = [10, 9, 8, 7, 6]
insertionSort(a)

print(a)
# [6, 7, 8, 9, 10]

插入排序算法的改进

算法思想:

(形式化描述)
将第一个元素标记为已排序
遍历每个没有排序过的元素
    “提取” 元素 X
    i = 最后排序过元素的指数 到 0 的遍历
        如果现在排序过的元素 > 提取的元素
            将排序过的元素向右移一格
        否则:插入提取的元素

算法图示:

插入排序.gif
Python使用函数实现:
def insertionSort(arrList):
    # 从1开始,第0个元素已经有序
    for i in range(1, len(arrList)):
        # 寻找arrList[i]合适的插入位置

        # 将当前元素提取出来
        x = arrList[i]
        # j保存元素应该插入的位置,初始为i
        j = i
        # -1取不到,可以取到0
        for j in range(i, -1, -1):
            if arrList[j-1] > x:
                # 赋值而不做交换
                arrList[j] = arrList[j-1]
            else:
                # 位置合适
                break

        arrList[j] = x

a = [10, 9, 8, 7, 6]
insertionSort(a)

print(a)
# [6, 7, 8, 9, 10]

冒泡排序(bubbleSort)

希尔排序(shellSort)

相关文章

  • 数据结构02-高效排序算法

    第二章 高效排序算法 第二章 高效排序算法一、快速排序基本思想快速排序图示一次划分C 语言实现Java 语言实现算...

  • 第二章:排序基础

    选择排序算法(selectionSort) 算法思想: 算法图示: 使用模板(泛型)编写算法:随机生成算法测试用例...

  • 开发者应该掌握的几种排序算法

    该篇文章主要介绍了算法基础以及几种常见的排序算法:选择排序、插入排序、冒泡排序、快速排序、堆排序。 一、算法基础 ...

  • 算法-排序算法总结

    排序类型总结 1 排序算法基础实现 2 排序算法应用 2.1 基础排序 2.2 计数排序应用 2.3 快排应用 2...

  • Java常见排序基础 - 中

    在Java常见排序基础 - 上中主要介绍了冒泡排序、选择排序、插入排序三种基础排序,本篇文章主要介绍的是 快速排序...

  • c++day09

    插入排序基础版(后插1) 插入排序基础版(后插2) 改进 插入排序基础版(前插) 字符数组 ASCII 的 A =...

  • 数据结构与算法-排序/二分查找

    算法中基础中的基础,排序/二分查找 排序 1.快排QuickSort 归并排序 堆排序 1. 二分查找

  • 排序算法总结

    基础排序算法 基础排序算法相关接口和实现类 接口: 实现类(后续排序的父类): 1.选择排序 两层循环:内层循环进...

  • C#入门(数组排序,二维数组,锯齿数组,输出蛇形矩阵)

    数组排序 冒泡排序 冒泡排序是数组的基础排序方法 int[] intArray = { 1, 5, 5, 79, ...

  • 排序算法

    概述 一般排序算法(以元素比较为基础) => 快速排序、归并排序、插入排序、冒泡排序、堆排序 特殊排序算法 => ...

网友评论

    本文标题:第二章:排序基础

    本文链接:https://www.haomeiwen.com/subject/ihlsbqtx.html