十种排序算法

一:三种比较LOW的排序算法

1、冒泡排序:

冒泡算法的时间复杂度为o(n2),有两个循环,外层循环为趟数,循环的趟数为数组长度值减一,因为最后剩一个元素时,不用比较了,所以减一(趟数大了,超过这个数计算结果仍然正确,只是计算的时间会加长)。内层循环为下标移动比较的范围,一次比较选择两个下标因此(j+1)为每一趟比较的后一个数,j+1最多到达每一趟的最后一个元素。

代码实现:

def bubble_sort(li):
    """
    升序排列,降序排列把加号改为减号
    :param li: 输入的乱序列表
    :return: 原地改变列表的值
    """
    # 趟数,比列表长度少1,为最后个元素下标
    for i in range(len(li)-1):
        # j的循环范围,j在j+1前,为每趟循环的最后元素位置,第一次循环时,两个range内的值相等
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j], li[j+1] = li[j+1], li[j]

2、选择排序

两种写代码的思路:

1、依次将该元素和后面的元素比较,如果出现后面的元素小于前面的元素则交换,一趟比较完成后,往后移,再依次比较。

2、找到需要比较的元素中最小的元素,将最小元素和需要保存该元素的位置的元素交换

代码实现:

1、

def selection_sort(li):
    """
    选择排序,
    :param li: 输入乱序列表
    :return: 原地排序
    """
    for i in range(len(li)-1):#需要确定的最小元素的位置,该位置之前有序区。开始时,在0号元素之前没有元素,所有的均为无序区
        for j in range(i+1,len(li)):#上述位置后的元素位置,在上述位置和之后的位置为无序区
            if li[i] > li[j]:
                li[i], li[j] = li[j], li[i]

2、

def selection_sort1(li):
    for i in range(len(li)-1):
        temp = li[i]
        a = i
        for j in range(i+1,len(li)):
            if temp > li[j]: temp = li[j] a = j li[a] = li[i] li[i] = temp

相比较第二种思路,思路比较麻烦,代码也比较麻烦。不用管第二种,知道就行。第二种方法多了中间变量,有点类似于c语言的交换,这种写法更适合c语言。

猜你喜欢

转载自www.cnblogs.com/zjsthunder/p/9754572.html
今日推荐