算法练习2:排序

排序

排序分为内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。
在这里插入图片描述

在这里插入图片描述
注:以下所有排序均是从小到大排

1.冒泡排序

思路

循环n-1次,每次循环比较前n-i个元素,i为当前循环的次数。
依次遍历要比较的n-i个元素,如果当前第j个元素比第j+1个元素大,就交换他们两个。
j从0开始,到n-i-1结束。

代码实现

def bubbleSort(arr):
    for i in range(1, len(arr)):
        for j in range(0, len(arr)-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr

2.选择排序

思路

循环n-1次,每次循环比较后n-i个元素,i为当前循环的次数。
遍历后n-i个元素,将它们依次与arr[i]比较,如果当前第j个元素比arr[i]小,交换它们的位置。

代码实现

def selectionSort(arr):
    for i in range(len(arr) - 1):
        # 记录最小数的索引
        minIndex = i
        for j in range(i + 1, len(arr)):
            if arr[j] < arr[minIndex]:
                minIndex = j
        # i 不是最小数时,将 i 和最小数进行交换
        if i != minIndex:
            arr[i], arr[minIndex] = arr[minIndex], arr[i]
    return arr

3.插入排序

思路

循环遍历整个数组,将当前元素依次与前面的元素比较,如果前面的元素大于当前元素,则将前面的元素后移一位,一直到前面的元素不再大于当前元素,将当前元素挪到前面的元素后一位。

代码实现

def insertionSort(arr):
    for i in range(len(arr)):
        preIndex = i-1
        current = arr[i]
        while preIndex >= 0 and arr[preIndex] > current:
            arr[preIndex+1] = arr[preIndex]
            preIndex-=1
        arr[preIndex+1] = current
    return arr

4.希尔排序

思路

在要排序的一组数中,根据某一增量分为若干子序列,并对子序列分别进行插入排序。
然后逐渐将增量减小,并重复上述过程。
希尔排序是插入排序的改进版本,插入排序每次比较后移一位,希尔排序每次比较后移与增量大小一样的位数。
增量初始选择len(arr)//3+1,然后增量逐渐减小,直至为1。每选择一个增量,进行一次插入排序
插入排序可以看作是增量为1的希尔排序。

代码实现

def shellSort(arr):
    import math
    gap=1
    while(gap < len(arr)/3):
        gap = gap*3+1
    while gap > 0:
        for i in range(gap,len(arr)):
            temp = arr[i]
            j = i-gap
            while j >=0 and arr[j] > temp:
                arr[j+gap]=arr[j]
                j-=gap
            arr[j+gap] = temp
        gap = math.floor(gap/3)
    return arr

5.归并排序

思路

归并排序分为自上而下的递归和自下而上的迭代两种实现方式,这里介绍递归的实现。
归并排序分为两个过程,分解和合并
首先是分解,将待排序数组均分为两组,再将分出来的两组数据各自分为两组,依次类推,直到分出来的小组只有1个数据ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值