C++ STL中sort()函数用法及原理浅析

1. 为什么要用c++标准库里的排序函数

sort() 函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高!

2. c++标准库里的排序函数的使用方法

(1) Sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!
(2) Sort函数有三个参数:

  1. 第一个是要排序的数组的起始地址。
  2. 第二个是结束的地址(最后一位要排序的地址)
  3. 第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。

使用案例

#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就使用快排,否则使用插排。

  1. 插入排序
    在这里插入图片描述
    插入排序的实现方法是:按照顺序,从第一个数开始向后面依次遍历,寻找后面的元素在前面元素的位置,然后将数字插入进去,所以很容易知道插入排序的时间复杂度为 O ( n 2 ) O(n^2) 次方,其实现程序如下:
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; //插在最前面时特殊考虑
    }
}
  1. 快速排序:
    快速排序是一种对于冒泡排序的方法的一种改进,冒泡排序是将两个相邻元素进行交换,而快速排序在此基础上使用了二分法对数组进行操作,然后基数右侧的都是比基数大的数字,而左侧都是比它小的数字,然后进行递归排序。但快速排序并不是一个稳定的排序算法,其时间复杂度并不是确定的,其平均时间复杂度为 O ( n l o g   n   ) O(n*log~n~) ,但当情况特殊时,其最差的时间复杂度为 O ( n l o g   n   ) O(n*log~n~) 和冒泡排序相同,其基本的排序的规则如下:
    在这里插入图片描述
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);
}
发布了37 篇原创文章 · 获赞 30 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_40941722/article/details/90814300
今日推荐