数据结构---选择排序和交换排序

简介: 数据结构---选择排序和交换排序

选择排序

选择排序

基础版的选择排序实现是很简单的,算法思路如下

在这里插入图片描述

在这里插入图片描述

这里需要注意一点是,maxi可能会和begin重叠,导致交换begin和min的时候产生bug,因此只需要在前面补充一下条件即可

void SelectSort(int* a, int n)
{
   
   
    int begin = 0, end = n - 1;
    while (begin < end)
    {
   
   
        int maxi = begin, mini = begin;
        for (int i = begin; i <= end; i++)
        {
   
   
            if (a[i] > a[maxi])
            {
   
   
                maxi = i;
            }

            if (a[i] < a[mini])
            {
   
   
                mini = i;
            }
        }

        Swap(&a[begin], &a[mini]);
        // 如果maxi和begin重叠,修正一下即可
        if (begin == maxi)
        {
   
   
            maxi = mini;
        }

        Swap(&a[end], &a[maxi]);

        ++begin;
        --end;
    }
}

堆排序

堆排序前面文章有过详细讲解,这里就不多赘述了

数据结构---手撕图解堆

直接上代码实现

void Swap(int* p, int* c)
{
   
   
    int tmp = *p;
    *p = *c;
    *c = tmp;
}

void AdjustDown(int* a, int n, int parent)
{
   
   
    int child = parent * 2 + 1;
    while (child < n)
    {
   
   
        if (child + 1 < n && a[child + 1] > a[child])
        {
   
   
            child++;
        }
        if (a[parent] < a[child])
        {
   
   
            Swap(&a[parent], &a[child]);
            parent = child;
            child = parent * 2 + 1;
        }
        else
        {
   
   
            break;
        }
    }
}

void HeapSort(int* a, int n)
{
   
   
    // 建堆
    for (int i = (n - 2) / 2; i >= 0; i--)
    {
   
   
        AdjustDown(a, n, i);
    }

    // 堆排序
    int end = n - 1;
    while (end)
    {
   
   
        Swap(&a[0], &a[end]);
        AdjustDown(a, end, 0);
        end--;
    }
}

交换排序

冒泡排序

在这里插入图片描述

入门出学的第一个排序,效率很低

void BubbleSort(int* a, int n)
{
   
   
    for (int i = 0; i < n - 1; i++)
    {
   
   
        int flag = 0;
        for (int j = 0; j < n - i - 1; j++)
        {
   
   
            if (a[j] > a[j + 1])
            {
   
   
                flag = 1;
                int tmp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = tmp;
            }
        }
        if (flag == 0)
        {
   
   
            break;
        }
    }
}

下面重点是对快速排序进行学习,快速排序正常来说是泛用性最广的排序算法

相关文章
|
7天前
|
搜索推荐 算法 测试技术
【数据结构】排序
【数据结构】排序
|
1月前
|
搜索推荐
【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】
【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】
【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】
|
1月前
|
搜索推荐
【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】
【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】
|
1月前
|
搜索推荐 测试技术
【数据结构常见七大排序(一)】—插入排序篇【直接插入排序】And【希尔排序】
【数据结构常见七大排序(一)】—插入排序篇【直接插入排序】And【希尔排序】
|
2月前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
2月前
|
搜索推荐 算法
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
【排序】数据结构——排序算法概念及代码详解(插入、冒泡、快速、希尔)
TU^
|
2月前
|
搜索推荐 算法 测试技术
数据结构~~排序
数据结构~~排序
TU^
21 1
|
2月前
|
搜索推荐 算法 测试技术
数据结构——排序
数据结构——排序
17 1
|
2月前
|
算法 搜索推荐
数据结构与算法-选择排序
数据结构与算法-选择排序
21 4
|
2月前
|
算法 Java 调度
Java数据结构与算法:拓扑排序
Java数据结构与算法:拓扑排序