STL vector+sort排序和multiset/multimap排序比較

由 www.169it.com 蒐集整理html

 在C++的STL庫中,要實現排序能夠經過將全部元素保存到vector中,而後經過sort算法來排序,也能夠經過multimap實如今插入元素的時候進行排序。在經過vector+sort進行排序時,全部元素須要先存入vector容器中,sort在排序時又須要將元素所有取出來再進行排序。multimap底層實現爲紅黑樹,所以元素在插入的過程當中就實現了排序。那麼到底哪種排序速度更快呢?算法

   下面有一個測試程序:測試

   

1spa

2code

3htm

4排序

5內存

6ci

7字符串

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

#include <vector>

#include <set>

#include <algorithm>

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/time.h>

using namespace std;

double time() {

  struct timeval tv;

  if (gettimeofday(&tv, NULL) != 0) return 0.0;

  return tv.tv_sec + tv.tv_usec / 1000000.0;

}

struct Score {

  string name;

  double score;

  bool operator <(const Score& right) const {

    return score < right.score;

  }

};

int main(int argc, char** argv) {

  vector<Score> src;

  for (int i = 0; i < 10000000; i++) {

    int num = rand();

    char buf[32];

    sprintf(buf, "%d", num);

    Score score = { buf, num };

    src.push_back(score);

  }

  {

    double stime = time();

    vector<Score> res;

    for (vector<Score>::const_iterator it = src.begin();

         it != src.end(); ++it) {

      res.push_back(*it);

    }

    sort(res.begin(), res.end());

    double etime = time();

    printf("vector: %f\n", etime - stime);

  }

  {

    double stime = time();

    multiset<Score> res;

    for (vector<Score>::const_iterator it = src.begin();

         it != src.end(); ++it) {

      res.insert(*it);

    }

    double etime = time();

    printf("multiset: %f\n", etime - stime);

  }

  return 0;

}

程序運行結果爲:

1

2

3

         time

vector   4.776060

multiset 10.761023

在這個測試中,vector+sort排序比multiset(multimap實現基於multiset)快多了。快速排序是目前已知的全部排序算法中最快的排序算法,所以它比基於堆排序的multiset快。

 在這個測試結果出來以前,大多數人都會毫無疑問地認爲multiset排序要更快。這也是有緣由的,快速排序速度雖然快,可是在實際的運行過程當中,它須要大量地拷貝元素,其拷貝操做的時間複雜度爲o(NlogN),而基於紅黑樹的multiset在排序的過程當中則避免了元素的拷貝。若是元素的內存佔用空間比較大,那麼multiset排序的速度將比vector+sort快。爲了測試這個結果,將上面測試程序中的結構體改成:

1

2

3

4

5

6

7

8

9

10

struct Score {

  string name1;

  string name2;

  string name3;

  string name4;

  double score;

  bool operator <(const Score& right) const {

    return score < right.score;

  }

};

而後從新編譯運行測試程序,測試結果爲:

1

2

3

         time

vector   12.955739

multiset 11.368364

這個測試結果和咱們的預期一致。

  總之,咱們在使用STL的排序算法時,須要根據不一樣的元素構造來進行合適的選擇,若是都是比較簡單的元素,那麼適合選擇vector+sort來進行排序,對於由字符串構成的佔用了比較大的空間的複雜元素,應該使用multiset。若是排序的元素的總個數比較少,那麼選擇任意一種均可以。

 

相關文章
相關標籤/搜索