内部排序算法之比较排序(一)

内部排序算法指的是数据记录在内存中的排序,通常分为两类:比较排序和非比较排序,接下来主要介绍以下常用几个比较排序算法。

  • 冒泡排序
  • 基本思想:“轻者上浮,重者下沉”;一趟冒泡的过程:从最左或(最右)侧开始依次比较相邻两个元素大小,每次比较的两个元素记为left,right,若right<left则互换两个元素的值,反之继续向另一侧移动,重复上面的比较,直到到达另一侧;每一趟比较都会有一个元素到达最终位置,进行n-1趟冒泡。
  • 算法优化思路:若在一趟冒泡中没有元素交换,则表示该序列已经有序,此时可以不用等到轮询完n-1趟冒泡就可以结束算法
  • 示例:从最左侧开始与相邻元素比较,进行冒泡排序
  • 冒泡排序算法时间复杂度:最好的情况(序列本来就有序)下只需要一趟冒泡就行,比较n-1次,移动0次,时间复杂度为 O(n);最坏的情况(序列本来就逆序)下需要进行n-1趟冒泡,比较次数为即n(n-1)/2,每次比较必须移动3次记录,比较次数为3*即3*n(n-1)/2,时间复杂度为O(n^2)
  • python 编写冒泡排序算法
def bubble_sort(A):
    if not isinstance(A,list):
        print  "输入错误,输入必须是列表"
    else:
        length = len(A)
        for i in range(length-1):#n-1趟冒泡
            flag = False
            for j in range(length-1-i):#每一趟冒泡
                if A[j]>A[j+1]:
                    temp = A[j+1]
                    A[j+1]=A[j]
                    A[j]=temp
                    flag = True
            if not flag:#一趟冒泡中无交换操作表示已排好序
                break

  • 冒泡排序算法特点:1)排序效率与输入序列的有序性有关(顺序最优,逆序最差);2)每一趟排序均有一个元素到达最终位置;3)冒泡排序具有稳定性。


  • 选择排序
  • 基本思想:将序列S划分成已排序S1序列和待排序S2序列两个部分,初始时已排序序列S1=[],待排序序列S2=S,进行n-1趟“选择”,每一趟从待排序序列S2中“取”出最小(大)元素,“放”到已排序序列S1尾部,直到待排序序列为空为止。
  • 优化常规思路:将序列S划分成待排序序列S1和已排序序列S2两个部分,进行n-1次“选择”,初始时S1=[a1,..,an-1],S2=[],每次“选择”进行如下操作:起始时设S1最大值索引为0,从左向右逐个比较得到S1中最大值的索引,若最大值索引在比较过程中每一次都发生变化,则表明S1中已是升序,算法退出。否则,若最大值索引为S1最右侧元素位置,则直接将S1中最右侧元素“取出”,“放到”S2中的首部,否则,将S1中最大值与S1最右侧元素对调位置,再将对调后S1中最右侧元素“取出”,“放到”S2中的首部,直到S1中元素为空,算法退出
  • 选择排序算法特点:1)移动次数最好时(有序)为0,最坏时(逆序)为3*(n-1),比较次数始终为n*(n-1)/2;2)每一趟排序均有一个元素到达最位置;3)选择排序是不稳定排序。
  • 算法时间复杂度:最好O(n^2) 最坏O(n^2) 平均O(n^2);
  • 算法改进之后,最好情况(有序)为移动0次,比较(n-1)次,算法时间复杂度为O(n);最坏情况(逆序)为移动3*(n-1)次,比较n*(n-10/2次,算法时间复杂度为O(n^2)。
  • 示例:
  • python 实现改进后的选择排序算法代码
def select_sort(A):
    
    if not isinstance(A,list):
        print  "输入错误,输入必须是列表"
    else:
        n = len(A)
        for i in range(n-1,0,-1):
            sorted = True
            max = 0
            for j in range(1,i+1):
                if A[j]>=A[max]:#最大值索引更换
                    max = j
                else:
                    sorted = False
            if sorted:#最大值索引一直更换,则表示已是升序
               break
            elif max!=i:
                temp = A[i]
                A[i]=A[max]
                A[max]=temp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值