排序算法总结

冒泡排序

1.原理:比较相邻的两个元素大小,若前者大于后者则交换位置。
2.思路:数组a,长度为n
(1)比较第1轮:第一个元素a[1]和第二个元素a[2]相比,a[1]>a[2],则比较a[2]和a[3];否则交换a[1]和a[2],再比较a[2]和a[3];以此类推知道最后一个比较完成,此时a[n-1]处的元素为a中的最大值,不用参加下轮比较。
(2)比较第2轮:第一个元素a[1]和第二个元素a[2]相比,a[1]>a[2],则比较a[2]和a[3];否则交换a[1]和a[2],再比较a[2]和a[3];以此类推知道最后一个比较完成,此时a[n-2]处的元素为a中的最大值,不用参加下轮比较。
…以此类推直到所有的元素都被遍历
3.代码

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


a = maopaoSort([2, 34, 9, 7, 5, 1, 98, 6, 100])
print(a)

选择排序

1.原理:遍历待排序序列找到最小值,把最小值放入已排序的序列。
2.思路:数组a,长度为n
(1)比较第1轮:选择第一个元素为min,min=0,遍历待排序序列,与a[min]相比,若小于a[min],将下标值给min,继续遍历,得到待排序序列最小值,把最小值放入已排序的序列。
(2)比较第2轮:第二个元素a[2]与a[min]相比,若小于a[min],将下标值给min,继续遍历,得到待排序序列最小值,把最小值放入已排序的序列。
…以此类推直到所有的元素都被遍历
参考:选择排序思路
3.代码

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


a = choose([1, 2, 34, 9, 7, 5])
print(a)

插入排序

1.原理:遍历待排序序列找到最小值,把最小值放入已排序的序列。
2.思路
假设有一组无序序列 R0, R1, … , RN-1。
(1) 将序列中下标为 0 的元素视为元素个数为 1 的有序序列。
(2) 依次把 R1, R2, … , RN-1 插入到这个有序序列中。所以,我们需要一个外部循环,从下标 1 扫描到 N-1 。
(3)将 Ri 插入到前面有序的序列中。由前面所述,我们可知,插入Ri时,前 i-1 个数肯定已经是有序了。
所以我们需要将Ri 和R0 ~ Ri-1 进行比较,确定要插入的合适位置。这就需要一个内部循环,我们一般是从后往前比较,即从下标 i-1 开始向 0 进行扫描。
3.代码

def insertkSort(arr):
    for i in range(1, len(arr)):
        curr = arr[i]
        preindex = i-1
        while curr < arr[preindex]:
            arr[preindex + 1] = arr[preindex]
            preindex -= 1
        arr[preindex + 1] = curr
    return arr
a = insertSort([1, 2, 34, 9, 7, 5])
print(a)

归并排序

1.原理
2.思路
归并排序
3.代码

def merge(left, right):
    leftindex, rightindex = 0, 0
    arr = [0 for i in range(len(left)+len(right))]
    for i in range(0, len(arr)):
        if rightindex >= len(right):
            arr[i] = left[leftindex]
            leftindex += 1
        elif leftindex >= len(left):
            arr[i] = right[rightindex]
            rightindex += 1
        elif left[leftindex] > right[rightindex]:
            arr[i] = right[rightindex]
            rightindex += 1
        elif left[leftindex] < right[rightindex]:
            arr[i] = left[leftindex]
            leftindex += 1
    return arr


def merge_sort(arr):
    if len(arr) < 2:
        return arr

    mid = len(arr) // 2
    left = arr[0:mid]
    right = arr[mid:len(arr)]
    return merge(merge_sort(left), merge_sort(right))

快速排序

1.原理
(1).首先选取一个pvoit,将数组中比pvoit大的数放在后面,小的数放在pvoit后面
设计左右指针,分别从数组两边开始找到pvoit的索引值
(2).递归排列左边的数组和右边的数组
2.思路
快速排序
3.代码

def quick_merge(arr, low, high):
    leftindex, rightindex, privot = low, high, arr[low]
    while leftindex < rightindex:
        while arr[rightindex] > privot and leftindex < rightindex:
            rightindex -= 1
        arr[leftindex] = arr[rightindex]
        while arr[leftindex] < privot and leftindex < rightindex:
            leftindex += 1
        arr[rightindex] = arr[leftindex]
    arr[leftindex] = privot
    return leftindex


def swap(a, b):
    temp = a
    a = b
    b = temp


def quick_sort(arr, low, high):
    if low < high:
        priv = quick_merge(arr, low, high)
        quick_sort(arr, low, priv-1)
        quick_sort(arr, priv+1, high)


arr = [1, 6, 0, 2, 34, 9, 7, 5]
quick_sort(arr, 0, len(arr)-1)
for i in range(len(arr)):
    print("%d" % arr[i])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值