Python实现常见的排序算法

1.冒泡排序

# [6,3,9,4,2]
def bubble_sort(li):
    n = len(li)
    # 确定冒泡排序的趟数 n - 1
    for j in range(n - 1): # 0 1 2 3

        count = 0
        # 冒泡排序一趟,把最大的一个数排到最右边
        for i in range(n - 1 - j): # 0 3 每一趟冒泡 比较的次数越来越少
            if li[i] > li[i + 1]:
                # 交换
                li[i], li[i + 1] = li[i + 1], li[i]
                count += 1
        # for循环结束时,如果没有交换过,证明已经有序,直接返回
        if count == 0:
            break

if __name__ == ‘__main__‘:
    l = [1,1,2,4,5,6]
    # 3, 6, 4, 2, 9
    # i = 3
    # 3,6,4,2,9
    # 3,4,2,6,9
    bubble_sort(l)
    print(l)
    # 最坏时间复杂度:O(n^2)
    # 最优时间复杂度:O(n)
    # 稳定性:稳定

2.选择排序

# [6,3,9,4,2]
def select_sort(li):
    n = len(li)
    # 总共选择的次数,每次选择的最小数 放的位置 0 ~ n-1
    for j in range(n - 1):

        # 选择一次,找出最小的一个数,放到0位置
        temp = j  # 从这个位置开始比较,比较出最小的数放到这个位置
        for i in range(j + 1, n):
            if li[i] < li[temp]:
                temp = i
        # for循环结束时,temp指向最小的数
        # 交换temp和0位置
        li[temp], li[j] = li[j], li[temp]

if __name__ == ‘__main__‘:

    l = [1,2,3,4,5]
    # 2,3,9,4,6
    select_sort(l)
    print(l)
    # 最坏时间复杂度:O(n^2)
    # 最优时间复杂度:O(n^2)
    # 稳定性:不稳定

3.插入排序

# [6,3,9,4,2]
def insert_sort(li):
    n = len(li)
    # 不停的指向插入排序,从1~n-1 位置的数据,依次跟前面有序的序列组成有序
    for j in range(1, n):

        # 把0位置的数认为有序,把下一个位置跟前面组成有序
        for i in range(j, 0, -1):
            if li[i] < li[i - 1]:
                li[i], li[i - 1] = li[i - 1], li[i]
            else:
                break

if __name__ == ‘__main__‘:
    l = [1,2,3,4,5]
    insert_sort(l)
    print(l)

    # 最坏时间复杂度:O(n^2)
    # 最坏时间复杂度:O(n)
    # 稳定性:稳定

4.希尔排序

# [6,1,4,2,5,3]
def shell_sort(li):
    n = len(li)
    # 设置步长,根据步长进行排序
    gap = n//2

    # 不停的改变步长,最后一个步长必须是1
    while gap >= 1:

        for i in range(gap, n):
            while (i - gap) >= 0:
                if li[i] < li[i - gap]:
                    li[i], li[i - gap] = li[i - gap], li[i]
                i -= gap

        gap //= 2
if __name__ == ‘__main__‘:

    l = [6,1,4,2,5,3]
    shell_sort(l)
    # 最坏时间复杂度:O(n^2)
    # 最坏时间复杂度: 跟步长相关
    # 稳定性:不稳定

5.快排

# [6,9,4,8,5,7]

def quick_sort(li, start, end):
    if start>=end:
        return
    # 左边角标
    left = start
    # 右边角标
    right = end
    # 把0位置的数作为中间值
    mid = li[left]

    while left < right:

        # 右边的角标往左移动,找的一个小于中间值的数,把数放到左边角标位置
        while left < right and li[right] >= mid:
            right -= 1
        # 当white循环结束时,right指向的值小于mid
        li[left] = li[right]

        # 左边的角标往右移动,找的一个大于中间值的数,把数放到右边边角标位置
        while left < right and li[left] <= mid:
            left += 1
        li[right] = li[left]
    # while结束,left=right,把中间值赋值到这个位置
    li[left] = mid

    # 排序左边的数据
    quick_sort(li, start, left-1)
    # 排序右边的数据
    quick_sort(li, left+1, end)

if __name__ == ‘__main__‘:
    l = [6,8,4,4]
    quick_sort(l,0,len(l)-1)
    print(l)
    # 最坏时间复杂度 : O(n^2)
    # 最优时间复杂度 : O(nlogn)
    # 稳定性:不稳定

6.归并排序

# [7,6,8,  9,10,2,1]

def merge_sort(li):
    if len(li) == 1:
        # print(li)
        return li
        # 获取中间位置
    mid = len(li) // 2

    # 拆分左右各一半
    left = li[:mid]
    right = li[mid:]

    # print(left)
    # print(right)

    # 递归拆分
    left_res = merge_sort(left)
    right_res = merge_sort(right)
    # result = left_res + right_res
    # print(result)
    # 合并排序
    result = merge(left_res,right_res)
    return result

def merge(left, right):
    # 把下层方法返回的数据进行排序
    # [6] [8]
    # [5,7,9] [6,8]
    # 5 6 7
    res = []
    left_index = 0
    right_index = 0

    while left_index < len(left) and right_index < len(right):

        if left[left_index] <= right[right_index]:
            res.append(left[left_index])
            left_index += 1
        else:
            res.append(right[right_index])
            right_index += 1
    # while结束后,把剩下的数据全部添加
    res += right[right_index:]
    res += left[left_index:]
    return res

if __name__ == ‘__main__‘:
    l = [7, 8, 6, 9, 10, 2, 1]
    print(merge_sort(l))

    # 最坏时间复杂度:O(nlogn)
    # 最优时间复杂度:O(nlogn)
    # 稳定性:稳定
时间: 2024-11-10 15:25:27

Python实现常见的排序算法的相关文章

Python全栈开发之5、几种常见的排序算法以及collections模块提供的数据结构

在面试中,经常会遇到一些考排序算法的题,在这里,我就简单了列举了几种最常见的排序算法供大家学习,说不定以后哪天面试正好用上,文章后半段则介绍一下collections模块,因为这个模块相对于python提供的基本数据结构(list,tuple,dict)不被人们所熟悉,但是如果你对他们了解的话,用起来也是非常方便高效的. 排序算法 一.冒泡排序(BubbleSort) 步骤: 比较相邻的元素,如果第一个比第二个大,就交换他们两个. 循环一遍后,最大的数就“浮”到了列表最后的位置. 将剩下的数再次

python 十大经典排序算法

python 十大经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入.直接选择和冒泡排序. 线性对数阶 (O(nlog2n)) 排序 快速排序.堆排序和归并排序. O(n1+§)) 排序,§

java几种常见的排序算法总结

[java] view plain copy /*************几种常见的排序算法总结***************************/ package paixu; public class PaiXu { final int MAX=20; int num[]=new int[MAX]; { System.out.print("生成的随机数组是:"); for(int i=0;i<20;i++){ num[i]=(int)(Math.random()*100)

数据结构之常见的排序算法c语言实现

常见的简单排序算法有冒泡排序.选择排序.插入排序.快排.堆排序.归并排序.希尔排序等,这些排序的理论在网上有很多,这就只给出常见的排序算法源码,上学时候写的,不足之处欢迎大家指正. 下面几种排序的主函数入口为:     int main(int argc, char* argv[])         {      int i, len;      int a[] = {8,5,6,4,9,10,3,15,2,17};           len = (sizeof(a) / sizeof(a[0

常见比较排序算法的比较

几种常见的排序算法之比较 排序的基本概念以及其算法的种类,介绍几种常见的排序算法的算法:冒泡排序.选择排序.插入排序.归并排序.快速排序.希尔排序的算法和分析它们各自的复杂度,然后以表格的形式,清晰直观的表现出它们的复杂度的不同.在研究学习了之前几种排序算法的基础上,讨论发现一种新的排序算法,并通过了进一步的探索,找到了新的排序算法较之前几种算法的优势与不足. 排序算法,是计算机编程中的一个常见问题.在日常的数据处理中,面对纷繁的数据,我们也许有成百上千种要求,因此只有当数据经过恰当的排序后,才

常见的排序算法

描述: 排序算法可谓数据结构模块中的重中之重,常见的哈希表,二叉树,搜索树/平衡树,位图等数据结构只是处理实际问题的抽象方法,实际在处理接受或生成的数据集时,排序算法显得尤其重要,排序算法家族很庞大,其中包括了冒泡排序,选择排序,插入排序,堆排序,快速排序,归并排序,基数排序,计数排序,希尔排序,箱排序,树型排序等众多算法,每种排序都有各自的特性,没有好坏之分,只有在特定的场景使用合适的排序算法才是上策,单纯的来比显得太过绝对,没有可比性.因为实际需求及各方面条件的限制使得排序算法的可选范围往往

用Java来写常见的排序算法

随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * * @author huwei * */ public class Sort { public static void main(String[] args) { int[] a = { 60, 57, 89, 47, 57, 98, 45, 35, 73 }; Sort sort = new So

常见的排序算法--java版

个人总结的常见的排序算法 public class Sort { // 1.冒泡:稳定,最优O(n) 最差O(n^2) 平均O(n^2) private static void sort1(int[] arr) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - 1; j++) { if (arr[j] > arr[j + 1]) { int tmp = arr[j]; arr[j] = ar

几种常见的排序算法

1.插入类排序 在一个已经有序的序列中,插入一个新的记录.有直接插入排序.折半插入排序.希尔排序. 插入类排序 直接插入排序 1 void InsertSort(int R[], int n) 2 { 3 int i, j; 4 int temp; 5 for (i = 1; i < n; ++i) 6 { 7 temp = R[i]; 8 j = i - 1; 9 while (j >= 0 && temp < R[j]) 10 { 11 R[j+1] = R[j];