119 lines
3.6 KiB
C++
119 lines
3.6 KiB
C++
//
|
|
// 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
|