//
// Created by TYP on 2023/9/2.
//

#ifndef COMPRE_CALGORITHM_H
#define COMPRE_CALGORITHM_H

#include <cstdio>

void PrintArrayInt(const int array[], int nCnt)
{
    if (nCnt < 1)
        return ;
    for (int i = 0; i < nCnt; ++i)
        std::printf("%d ", array[i]);
    printf("\n");
}

class CAlgorithm {
public:
    CAlgorithm() = default;
    ~CAlgorithm() = default;
public:
    /*
    *  《1.直接选择排序》
    *
    *       直接选择排序又称简单选择排序,是一种`不稳定的`排序方法。
    *       时间复杂度:O(n^2)
    *       空间复杂度:O(1)
    *       其基本思想是:第 i 趟排序在待排序序列 a[i]~a[n] 中选取关键码最小的记录,
    *       并和第 i 个记录交换作为有序序列的第 i 个记录。
    *       相当于是认为左侧有序,右侧无序。
    *
    *   https://blog.csdn.net/u011815404/article/details/79256237
    */
    static void SortDirectSelectMethod(int array[], int nSize);

    /*
    *  《2.快速排序(快排)》
    *
    *       快速排序是一种不稳定的排序方法。
    *       时间复杂度:最坏情况下,时间复杂度是O(n^2),最优情况下,时间复杂度是O(nlogn);平均时间复杂度是O(nlogn);
    *       空间复杂度:O(logn)
    *       简单总结三步:
    *       第一步,从后往前找比基准小的数据,往前挪
    *       第二步,从前往后找比基准大的数据,往后挪
    *       第三步,重复第一步和第二步
    *
    *       https://blog.csdn.net/weixin_61453872/article/details/121481223
    */

    static void SortQuickMethod(int array[], int nStartIndex, int nEndIndex);

    /*
    *  《3.冒泡排序(起泡排序)》
    *
    *       冒泡排序是一种稳定的排序方法。
    *       时间复杂度:O(n^2)
    *       空间复杂度:O(1)
    *       两两比较,大(小)的换到后面。
    *
    */

    static void SortBubbleMethord(int array[], int nSize);

    /*
    *  《4.归并排序》
    *
    *       归并排序是一种稳定的排序方法。
    *       以空间换时间。算法中需要来回复制结果数组和原序列,很耗时,所以归并排序一般用于外排序
    *       时间复杂度:O(nlogn)
    *       空间复杂度:o(n)
    *       思路见 img/归并排序思路图.png 图片
    */

    /*
    *  《5.直接插入排序》
    *
    *       直接插入排序是一种稳定的的排序方法。
    *       时间复杂度:O(n^2)
    *       空间复杂度:O(1)
    */

    /*
    *  《6.希尔排序》
    *
    *       希尔排序是一种不稳定的排序方法。本质还是直接插入排序,添加了步长。
    *       时间复杂度:O(n^(1.3—2))
    *       空间复杂度:O(1)
    *       思路见 img/希尔排序思路图.jpeg 图片
    */

    /*
    *  《7.堆排序》
    *
    *       堆排序是一种不稳定的排序方法。由于初始构建堆所需的比较次数较多,所以不适合待排序序列个数较少的情况。
    *       时间复杂度:O(nlogn)
    *       空间复杂度:O(1)
    */

    /*
    *  《8.直接选择排序》
    *
    *       直接选择排序是一种不稳定的排序方法。
    *       时间复杂度:O(n^2)
    *       空间复杂度:O(1)
    *       说白了就是:直接找最小(大)的放前面,剩下的继续找最小(大)的放第二个,类推...
    */

};

// 直接排序测试
void SortDirectSelectMethodTest();
// 快速排序测试
void SortQuickMethodTest();
// 冒泡排序测试
void SortBubbleMethordTest();
#endif //COMPRE_CALGORITHM_H