1.概述

1.概述


1.1 基础知识

十大排序简介

1. 冒泡排序(Bubble Sort)

冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的元素,比较相邻的两个元素,将较大的元素交换到右侧。时间复杂度为 O(n^2),空间复杂度为 O(1)。

2. 选择排序(Selection Sort)

选择排序是一种简单直观的排序算法,每次选择未排序部分的最小元素,并将其放置在已排序部分的末尾。时间复杂度为 O(n^2),空间复杂度为 O(1)。

3. 插入排序(Insertion Sort)

插入排序是一种简单直观的排序算法,将待排序数组分为已排序和未排序两部分,每次将未排序部分的第一个元素插入到已排序部分的合适位置。时间复杂度为 O(n^2),空间复杂度为 O(1)。

4. 希尔排序(Shell Sort)

希尔排序是一种改进的插入排序算法,通过比较距离较远的元素进行交换,最终使得数组基本有序,然后再使用插入排序对基本有序的数组进行排序。时间复杂度取决于间隔序列的选择,一般为 O(n log n) 到 O(n^2),空间复杂度为 O(1)。

5. 归并排序(Merge Sort)

归并排序是一种分治算法,将待排序数组分成两个子数组,分别排序,然后合并成一个有序数组。时间复杂度稳定在 O(n log n),空间复杂度为 O(n)。

6. 快速排序(Quick Sort)

快速排序是一种分治算法,选择一个基准元素,将小于基准的元素放在左侧,大于基准的元素放在右侧,然后对左右两部分递归地进行排序。时间复杂度平均为 O(n log n),最坏情况为 O(n^2),空间复杂度为 O(log n)。

7. 堆排序(Heap Sort)

堆排序利用了堆这种数据结构,首先将待排序数组构建成一个最大堆,然后依次将堆顶元素与堆末元素交换并调整堆,直到整个数组有序。时间复杂度稳定在 O(n log n),空间复杂度为 O(1)。

8. 计数排序(Counting Sort)

计数排序是一种非比较排序算法,适用于一定范围内的整数排序,它统计每个元素的个数,然后根据统计信息对元素进行排序。时间复杂度为 O(n+k),其中 k 为最大元素与最小元素的差值,空间复杂度为 O(n+k)。

9. 桶排序(Bucket Sort)

桶排序是一种排序算法,它假设输入是由一个随机过程产生,将元素分布在一定范围内的桶中,然后对每个桶中的元素进行排序,最后按照顺序将所有桶中的元素合并。时间复杂度取决于桶的个数和每个桶内部的排序算法,通常为 O(n+k),其中 k 为桶的个数,空间复杂度为 O(n+k)。

10. 基数排序(Radix Sort)

基数排序是一种非比较排序算法,将整数按位数切割成不同的数字,然后按每个位数分别比较进行排序。时间复杂度稳定在 O(d*(n+k)),其中 d 为最大位数,k 为基数,空间复杂度为 O(n+k)。

算法属性表


为了方便,演示排序算法时都以从小到大排序作为例子


1.2 算法辅助类

namespace Lesson01_概述;

//提供各个排序都可能要用到的成员
public static class SortHelpTool
{
    // 待排序的数组
    public static int[] arrayToSort = { 5, 2, 8, 1, 7, 3, 10, 4, 6, 9 };

    // 输出数组元素
    public static void PrintArray(int[] array)
    {
        foreach (var item in array)
        {
            Console.Write(item + " ");
        }

        Console.WriteLine();
    }

    // 输出List元素
    public static void PrintList(List<int> array)
    {
        foreach (var item in array)
        {
            Console.Write(item + " ");
        }

        Console.WriteLine();
    }
    
    // 交换两个元素的值
    public static void Swap(ref int a, ref int b)
    {
        int temp = a;
        a = b;
        b = temp;
    }
    
    // 找到数组中的最大值
    public static int FindMaxValue(int[] array)
    {
        int max = array[0];
        foreach (var num in array)
        {
            if (num > max)
            {
                max = num;
            }
        }
        return max;
    }
    
    // 获取数字的指定位数的值 比如 数1234 第2位数 就是3 
    public static int GetDigit(int number, int digit)
    {
        return (number / (int)Math.Pow(10, digit - 1)) % 10;
    }

    // 计算数字的位数 比如 数1234 就有4位数 
    public static int CountDigits(int number)
    {
        return (int)Math.Floor(Math.Log10(number) + 1);
    }
}
SortHelpTool = {}

SortHelpTool.arrayToSort =  { 5, 2, 8, 1, 7, 3, 10, 4, 6, 9 }

function SortHelpTool.PrintArray(array, str)
    print(str .. "\t", table.concat(array, " "))
end

function SortHelpTool.Swap(array, i, j)
    temp = array[i]
    array[i] = array[j]
    array[j] = temp
end

function SortHelpTool.FindMaxValue(array)
    local max = array[1]
    for i = 2, #array do
        if array[i] > max then
            max = array[i]
        end
    end
    return max
end

function SortHelpTool.GetDigit(number, digit)
    return math.floor(number / 10^(digit - 1)) % 10
end

function SortHelpTool.CountDigits(number)
    return math.floor(math.log10(number)) + 1
end


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏