冒泡排序和选择排序

冒泡排序

工作原理

冒泡排序算法的原理如下:

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3.针对所有的元素重复以上的步骤,除了最后一个。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

实现代码

num = [124,32,1,567,25,688]
nu = [2,3,1,4,6]

def bubble_sort(nums):
    for i in range(len(nums)-1):        #冒泡循环的次数
        for j in range(len(nums)-1-i):    #每一次冒泡循环的比较次数
            if nums[j] > nums[j+1]:
                nums[j],nums[j+1] = nums[j+1],nums[j]
    return nums
print(bubble_sort(nu))
print(bubble_sort(num))

  以上这种冒泡排序还不够完善,以上这种方法在比如[6,1,2,3,4,5]时,将最大的数6排到最后一个位置之后,还是会在1,2,3,4,5之间又进行四次冒泡循环。

因此,我们有这种思路:如果在某次的冒泡循环中,都不需要交换列表中的元素,那么可以判定该元组里的数的大小已经排好,可以直接返回元组

  因此,以下代码是上述冒泡排序的一种优化:

def bubble_sort(nums):
    count_cyc = 0   #冒泡循环次数
    for i in range(len(nums)-1):
        need_ex_flag = False        #每一次循环需要交换的次数
        count_cyc +=1                #每循环一次,自增1
        print(count_cyc)
        for j in range(len(nums)-1-i):
            if nums[j] > nums[j+1]:
                need_ex_flag = True
                nums[j],nums[j+1] = nums[j+1],nums[j]
            elif not need_ex_flag:
                return nums
    return nums
print(bubble_sort(nu))
print(bubble_sort(num))

 

选择排序

工作原理

  • 设第一个元素为比较元素,找出比较元素后面的最小元素,如果在比较元素后的元素中选出的最小元素比比较元素小,那么将它和第一个元素互换,即第一个元素就是最小的元素
  • 重复上述操作,我们找出第二小的元素和第二个位置的元素互换,以此类推找出剩余最小元素将它换到前面,即完成排序

实现代码

def selectionSort(arr):
    for i in range(len(arr)-1):        #循环选择的遍数
        #记录最小数的索引,将起始元素设为最小元素
        minindex = i

        for j in range(i+1,len(arr)):    #第二层for表示最小元素和后面的元素逐个比较
            if arr[j]<arr[minindex]:
                minindex = j        # 如果当前元素比最小元素小,则把当前元素角标记为最小元素角标
                #i不是最小数时,将i和最小数进行交换
        if i !=minindex:    # 查找一遍后将最小元素与起始元素互换
            arr[i],arr[minindex] = arr[minindex],arr[i]
    return arr
lst = [3,1,6,2,5,9,7]
print(selectionSort(lst))

选择排序冒泡排序很类似,但是选择排序每轮比较只会有一次交换,而冒泡排序会有多次交换,交换次数比冒泡排序少,就减少cpu的消耗,所以在数据量小的时候可以用选择排序,实际适用的场合非常少

posted @ 2021-02-06 22:35  banaw  阅读(87)  评论(0)    收藏  举报