C++ 算法学习 之 sort

这里写目录标题

  • sort函数
    • 简单使用:
      • 通过上面的两个列子发现sort用的参数不一样为什么?
    • 进一步理解sort:
    • 那我们怎么进行自定义排序呢?
  • 力扣题目

c++ 官网手册 - sort
参考于官网

sort函数

std::sort 函数是C++标准库中提供的排序函数,它使用一种称为 “Introsort”
的混合排序算法来排序容器中的元素。Introsort 实际上是一种结合了三种不同排序算法的算法:

快速排序(QuickSort):在大多数情况下,Introsort会选择快速排序作为主要的排序算法。快速排序是一种分而治之的算法,通过选择一个基准元素将数据分为两部分,并递归地对这两部分进行排序。

堆排序(HeapSort):为了防止快速排序在某些情况下性能下降,Introsort还会监测递归深度,当递归深度过深时,会切换到堆排序。堆排序利用了二叉堆数据结构来进行排序。

插入排序(InsertionSort):对于小规模的子数组,Introsort会切换到插入排序。插入排序是一种简单但效率较低的排序算法,对于小规模的数据集,它的性能通常较好。

Introsort的特点是在大多数情况下,快速排序会被优先选择,但当快速排序的性能不佳时,会切换到堆排序,同时对于小规模的子数组,会使用插入排序来提高性能。

总之,std::sort函数的实现是综合考虑多种情况的,以在不同的输入情况下获得较好的性能。这使得它在大多数情况下都能表现出良好的排序性能。

简单使用:

sort是默认升序排序

先导入:

#include 

简单的理解:就是对一个容器里面的元素排序
下面是两种方法的排序

// 创建一个 std::vector 容器并添加一些元素
std::vector<int> nums = {5, 2, 8, 1, 9, 3};
// 使用 std::sort 对容器中的元素进行排序
std::sort(nums.begin(), nums.end());
//std::sort 函数的参数是迭代器,nums.begin() 表示容器中第一个元素的迭代器,
//nums.end() 表示容器中最后一个元素的后一个位置的迭代器

int nums_t[6] = {5, 2, 8, 1, 9, 3};
// 使用 std::sort 对整数数组中的元素进行排序
std::sort(nums_t, nums_t + 6);  // 注意:a + 6 表示数组的结束位置的下一个位置
//std::sort 函数的参数是指向数组第一个元素和数组末尾后一个位置的指针

通过上面的两个列子发现sort用的参数不一样为什么?

std::sort 函数的参数形式取决于你要对哪种类型的数据进行排序

对于容器,你可以使用迭代器来指定排序范围

对于数组,你需要使用指针来指定排序范围。

进一步理解sort:

要理解需要:1,明白函数模板。2,明白函数指针和使用。
c++ 官网手册 - sort
在这里插入图片描述
第一个版本

template<class RandomIt>
void sort(RandomIt first, RandomIt last);

排序范围内的元素将[first,last]范围内的元素按升序排序。
第一个版本使用操作符 < 比较元素

那我们怎么进行自定义排序呢?

还有一个模板
std::sort 函数用于对指定范围内的元素进行排序。
第二个版本使用操作符 comp 比较元素。
等价元素不能保证保持原来的相对顺序(参见稳定排序)。

template<class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);

RandomIt:表示一个随机访问迭代器(Random Access Iterator)的类型,用于指向要排序的范围的首尾元素。
Compare:是一个可调用对象(函数指针、函数对象、lambda 表达式等),用于自定义比较元素的方式。这个对象应该是一个二元谓词,接受两个参数,并返回 bool 类型,指示比较结果。

需要注意的是,compareByAge 函数满足严格弱序(Strict Weak Ordering)的要求,以确保排序的正确性。这是 std::sort 等排序算法的前提条件。
初步运用举例:

// sort algorithm example
#include      // std::cout
#include     // std::sort
#include        // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33

  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33

  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

myvector contains: 12 26 32 33 45 53 71 80

力扣题目

88.合并两个有序数组

你可能感兴趣的:(C++,算法,算法,c++,学习)