在C++ std库中使用sort()

时间:2020-02-23 14:30:04  来源:igfitidea点击:

介绍

我们将讨论C++中std库中的sort()函数。

对于基础知识,排序是系统地对项目进行排序的任何过程。
这些项目可以是序列的元素或者任何数据结构。

在C++中,标准库提供了一个预定义的,随时可以使用的函数sort()来执行此排序操作。
因此,让我们开始吧。

C++中的std :: sort()函数

C++中的std :: sort()函数是一个内置函数,用于按特定顺序对任何形式的数据结构进行排序。
它在" algorithm"头文件中定义。
下面给出了sort()函数原型。

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

在此,该函数不返回任何内容。
它只是从"第一个"到"最后一个"可迭代项或者位置更新元素/项。
第三个参数(可选)comp必须是一个确定元素排序顺序的函数。
如果未指定,则默认升序进行排序,因为它是std :: less <int>()函数。

" sort()"函数使用一种称为Introsort的3倍混合排序技术。
它是快速排序,堆排序和插入排序的组合。

使用C++中的sort()函数对数据进行排序

现在我们已经了解了sort()函数的基础知识,让我们在C++程序中使用它来对某些数据结构(例如数组)进行排序。

1.升序排列

如前所述,默认情况下,当未提及comp参数时,sort()函数会按升序对一组项目进行排序。

因此,对于下面的示例,我们仅传递了" first"(开始)和" last"(结束)可迭代对象,以对数组进行升序排序。

#include<iostream>    
#include<algorithm>
using namespace std;
int main()
{  
  //array initialisation
  int demo[5] = {5, 4, 3, 2, 1};
  
  int len = sizeof(demo)/sizeof(demo[0]);
   
  cout<<"Before sorting array : ";
  for(int i=0; i<len; i++)
  {
      cout<<" "<<demo[i];
  }
   
  std::sort(demo, demo + len);//Sorting demo array
   
  cout<<"\n\nAfter sorting array : ";
  for(int i=0; i<len; i++)
  {
      cout<<" "<<demo[i];
  }
  return 0;
}

其中" demo"是给定数组的第一个元素的地址,而"(demo + len)"是给定数组的最后一个元素的地址。
因此默认情况下考虑将comp作为std :: less <int>()函数,sort()函数以升序对数组进行排序。

注意:std :: less <int>()函数比较两个参数,并根据第一个参数是否小于另一个参数返回True或者False。

2.降序排列

我们还可以通过使用sort()函数的第三个参数,以降序对数据结构进行排序。
让我们看看如何。

在下面的代码中,我们使用了std :: greater <int>()函数,其功能与std :: less <int>()函数完全相反。
它比较两个参数,并在第一个大于另一个时返回True。
否则返回False。

#include<iostream>    
#include<algorithm>
using namespace std;
int main()
{  
  //array initialisation
  int demo[5] = {44, 22, 55, 33, 66};
  
  int len = sizeof(demo)/sizeof(demo[0]);
   
  cout<<"Before sorting array : ";
  for(int i=0; i<len; i++)
  {
      cout<<" "<<demo[i];
  }
   
  std::sort(demo, demo + len, greater<int>());//Sorting demo array
   
  cout<<"\n\nAfter sorting array : ";
  for(int i=0; i<len; i++)
  {
      cout<<" "<<demo[i];
  }
  return 0;
}

我们还可以将lambda函数用作sort()函数的第三个参数,如下所示。

#include<iostream>    
#include<algorithm>
using namespace std;
int main()
{  
  //array initialisation
  int demo[5] = {44, 22, 55, 33, 66};
  
  int len = sizeof(demo)/sizeof(demo[0]);
   
  cout<<"Before sorting array : ";
  for(int i=0; i<len; i++)
  {
      cout<<" "<<demo[i];
  }
   
  std::sort(demo, demo + len, [](int &e1, int &amp;e2){ return e1>e2; });//Sorting demo array
   
  cout<<"\n\nAfter sorting array : ";
  for(int i=0; i<len; i++)
  {
      cout<<" "<<demo[i];
  }
  return 0;
}

上面的两个示例都生成如下相同的输出。
并成功地按降序对" demo"数组进行排序。

3.按用户定义的顺序排序

std :: sort()函数的第三个参数(comp)也可以是用户定义的函数,用于定义顺序或者排序。

应该注意,此函数必须返回一个布尔值(" True" /" False")。

例如,在下面的代码段中,我们尝试根据数组元素除以10时产生的余数(使用'%%'运算符)对数组元素进行排序。

#include<iostream>    
#include<algorithm>
using namespace std;

//our function
bool My_func( int a, int b)
{	
	return (a%10)<(b%10);
}

int main()
{  
  //array initialisation
  int demo[5] = {18, 45, 34, 92, 21};
  
  int len = sizeof(demo)/sizeof(demo[0]);
   
  cout<<"Before sorting array : ";
  for(int i=0; i<len; i++)
  {
      cout<<" "<<demo[i];
  }
   
  std::sort(demo, demo + len, My_func);//Sorting demo array
   
  cout<<"\n\nAfter sorting array : ";
  for(int i=0; i<len; i++)
  {
      cout<<" "<<demo[i];
  }
  return 0;
}

从上面的输出中可以看到,已经成功地基于(element%10)因子对demo数组进行了排序。
借助我们的My_func()函数。

C++中std :: sort()的复杂性

sort()函数执行Nlog(N)比较以对N个项目进行排序。
因此,在最坏的情况下,它具有O(Nlog(N))复杂度。