1. 为什么要用c++标准库里的排序函数
sort() 函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高!
2. c++标准库里的排序函数的使用方法
(1) Sort函数包含在头文件为#include<algorithm>
的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!
(2) Sort函数有三个参数:
- 第一个是要排序的数组的起始地址。
- 第二个是结束的地址(最后一位要排序的地址)
- 第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
使用案例
#include <iostream>
#include <algorithm>
using namespace std;
bool compare(int a,int b){
return a>b;
}
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
sort(a,a+10,compare); //compare指定排序规则
for(int i=0; i<10; i++)
cout<<a[i]<<endl;
return 0;
}
3. sort()函数原理浅析
sort()主要由两种排序方法组成:插入排序和快速排序,STL中定义了一个SORT_MAX
变量来进行判断,如果大于SORT_MAX
就使用快排,否则使用插排。
- 插入排序
插入排序的实现方法是:按照顺序,从第一个数开始向后面依次遍历,寻找后面的元素在前面元素的位置,然后将数字插入进去,所以很容易知道插入排序的时间复杂度为 次方,其实现程序如下:
void Inser_Sort(int *arr, int n){
int tmp;
for(int i=1; i<n; i++){
tmp = arr[i];
int j = i-1;
while(j >= 0 && tmp < arr[j]){ //从小到大排序
arr[j+1] = arr[j];
j--;
}
arr[j+1] = tmp; //插在最前面时特殊考虑
}
}
- 快速排序:
快速排序是一种对于冒泡排序的方法的一种改进,冒泡排序是将两个相邻元素进行交换,而快速排序在此基础上使用了二分法对数组进行操作,然后基数右侧的都是比基数大的数字,而左侧都是比它小的数字,然后进行递归排序。但快速排序并不是一个稳定的排序算法,其时间复杂度并不是确定的,其平均时间复杂度为 ,但当情况特殊时,其最差的时间复杂度为 和冒泡排序相同,其基本的排序的规则如下:
void Quick_Sort(int *arr, int begin, int end){
if(begin > end)
return;
int tmp = arr[begin];
int i = begin;
int j = end;
while(i != j){
while(arr[j] >= tmp && j > i)
j--;
while(arr[i] <= tmp && j > i)
i++;
if(j > i){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[begin] = arr[i];
arr[i] = tmp;
Quick_Sort(arr, begin, i-1);
Quick_Sort(arr, i+1, end);
}