日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STL中sort算法简析

發布時間:2024/4/11 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STL中sort算法简析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STL里sort算法簡析

文章目錄

  • STL里sort算法簡析
    • 一、引入
    • 二、正解
    • 三、源碼
      • **`sort的源碼`**:
      • **`其中,__introsort_loop便是內省式排序:`**
      • 插入排序
      • **快速排序實現代碼**
      • 函數__lg()防止棧溢出

一、引入

如果面試官給你出了一道面試題:STL里sort算法用的是什么排序算法?

  • 當你第一眼看到這道面試題是不是心里在暗喜,因為排序講的是效率,時間復雜度越小越好,并且作為STL的標準算法,更因該注重效率,這時你的腦海里想的肯定是快排
  • 此時如果你回答:
  • STL里的sort算法肯定用的是快速排序啊?難不成還是冒泡排序么?那么恭喜你,你可能錯失了大廠的機會,如果面試官不提醒你,你可能覺得自己面的還可以
  • 嘿嘿😁~~~

如果你回答的是快排并且面試官沒有放棄你的話,你可能會遇到如下問題:

  • 數據量大和數據量小都適合用快速排序嗎?
  • 快速排序的時間復雜度不是穩定的nlogn,最壞情況會變成n^2,怎么解決復雜度惡化問題?
  • 快速排序遞歸實現時,怎么解決遞歸層次過深的問題?
  • 遞歸過深會引發什么問題?
  • 怎么控制遞歸深度?如果達到遞歸深度了還沒排完序怎么辦?

如果面試官問你了,那么說明你的大廠offer正在向你靠近,因為這些問題并不是你不會,只不過是沒沒把重心放在那方面而已

二、正解

  • 1.sort函數提供了兩個版本
  • sort(first, last):默認按照小于方式排序,排序結果為升序,一般用排內置類型數據
  • sort(first, last, comp):可以通過comp更改元素比較方式,即可以指定排序的結果為升序或者降序,一般以仿函數對象和函數指針的方式提供
  • 2.sort并不是一種排序算法,而是將多個排序算法混合而成
  • 3. 當元素個數少于__stl_threshold閾值時(16),使用直接插入排序處理
  • 4. 當元素個數超過__stl_threshold時,考慮是否能用快排的方式排序,因為當元素數量達到一定程度,遞歸式的快排可能會導致棧溢出而崩,因此:
  • 通過__lg函數判斷遞歸的深度
  • 5.如果遞歸的深度沒有超過2*lg(n) 時,則使用快排方式排序,注意:快排時使用到了三數取中法預防分割后一邊沒有數據的極端情況
  • 如果遞歸深度超過2*lg(n) 時,說明數據量大,遞歸層次太深,可能會導致棧溢出,此時使用堆排序處理

是不是很驚喜,很意外?

為什么?直接看STL源碼實現,來源于侯捷老師翻譯的鼎鼎大名的 《STL源碼剖析》 關于sort算法實現的細節,實現細節有很多精彩的地方。

總結:sort算法用到了快速排序,但不僅僅只用了快速排序,還結合了插入排序和堆排序。

三、源碼

sort的源碼

template<typename _RandomAccessIterator>inline void sort(_RandomAccessIterator __first, _RandomAccessIterator __last){typedef typename iterator_traits<_RandomAccessIterator>::value_type_ValueType;// concept requirements__glibcxx_function_requires(_Mutable_RandomAccessIteratorConcept<_RandomAccessIterator>)__glibcxx_function_requires(_LessThanComparableConcept<_ValueType>)__glibcxx_requires_valid_range(__first, __last);if (__first != __last){//快速排序+插入排序std::__introsort_loop(__first, __last,std::__lg(__last - __first) * 2);//插入排序std::__final_insertion_sort(__first, __last);}}

其中,__introsort_loop便是內省式排序:

template <class _RandomAccessIter, class _Tp, class _Size>void __introsort_loop(_RandomAccessIter __first,_RandomAccessIter __last, _Tp*,_Size __depth_limit) {while (__last - __first > __stl_threshold) {if (__depth_limit == 0) {partial_sort(__first, __last, __last);return;}--__depth_limit;_RandomAccessIter __cut =__unguarded_partition(__first, __last, _Tp(__median(*__first,*(__first + (__last - __first) / 2),*(__last - 1))));__introsort_loop(__cut, __last, (_Tp*)0, __depth_limit);__last = __cut;}}
  • 這里進來之后會 首先進行判斷元素是否大于__stl_threshold, __stl_threshold是一個常量值是16,意思就是說我傳入的元素規模小于我們的16的時候我們就沒必要采用我們的內省式算法,直接退回去采用我們的插入排序。
  • 這里能看到我們的內省式算法結束之后就是我們的插入排序函數。

插入排序

template<typename _RandomAccessIterator>void__final_insertion_sort(_RandomAccessIterator __first,_RandomAccessIterator __last){if (__last - __first > int(_S_threshold)){//先排前16個std::__insertion_sort(__first, __first + int(_S_threshold));//后面元素遍歷插入到前面有序的正確位置 std::__unguarded_insertion_sort(__first + int(_S_threshold), __last);}elsestd::__insertion_sort(__first, __last);}
  • 如果說我們的 元素規模大于我們的16了,那就需要去判斷如果我們是不是能采用快速排序,怎么判斷呢?快排是使用遞歸來實現的,如果說我們進行判斷我們的遞歸深度沒有到達我們的最深層次上邊的函數已經看過了,最深是2*lg(n)。那我們就去使用我們的快速排序來進行排序

快速排序實現代碼

template <class _RandomAccessIter, class _Tp>_RandomAccessIter __unguarded_partition(_RandomAccessIter __first, _RandomAccessIter __last,_Tp __pivot) {while (true) {while (*__first < __pivot)++__first;--__last;while (__pivot < *__last)--__last;if (!(__first < __last))return __first;iter_swap(__first, __last);++__first;} }
  • 如果說大于我們的最深層次的話,這里就會采用我們的堆排序,進行排序。
  • 當進行完這個過程的時候要明白,這里并不是說整個傳進來的數組都是這個過程,這里我們是進行的一次排序,他可能是我傳入的數組,也可能是我在進行快排分割之后的左半部分,排序結束之后再去排我的右半部分,所以可以看上邊我們的元素規模是不是大于__stl_threshold這個閾值的時候是一個while循環。

函數__lg()防止棧溢出

其第三個參數中所調用的函數__lg()便是用來控制分割惡化情況。代碼如下

template <class Size>inline Size __lg(Size n) {Size k;for (k = 0; n > 1; n >>= 1) ++k;return k;}

總結

以上是生活随笔為你收集整理的STL中sort算法简析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久精品人妻无码专区 | 欧美成人精精品一区二区频 | 日韩欧美亚洲综合 | 朝桐光av在线一区二区三区 | 黄网在线免费 | 欧美拍拍视频 | 真人bbbbbbbbb毛片 | 国产伦精品一区二区三区视频黑人 | 亚洲性猛交xxxx乱大交 | 欧美另类亚洲 | 亚洲特级黄色片 | 成人在线免费视频观看 | 香蕉视频在线观看黄 | 日日骚视频| jizz高潮| 天堂av中文字幕 | 欧美 日韩 中文字幕 | 欧美精品国产 | 欧美顶级毛片在线播放 | 久久精品免费在线 | 91九色精品 | 操网 | 999国产精品视频 | 黄色片视频免费 | 天天干夜夜嗨 | 亚洲自拍成人 | 一级黄色播放 | 国产又黄又爽又色 | 国产一区影院 | 法国经典free性复古xxxx | 男女男精品视频站 | 中文字幕不卡视频 | 国产欧美一区二区三区在线 | 成人短视频在线观看 | 拍真实国产伦偷精品 | 欧美精品色哟哟 | 美女扒开下面让男人捅 | 亚洲第一免费播放区 | 国产又黄又骚 | 国产精品久久久久久久蜜臀 | 一级毛片基地 | 狠狠干天天 | 关之琳三级全黄做爰在线观看 | 91超薄肉色丝袜交足高跟凉鞋 | 97在线公开视频 | 国产卡一卡二在线 | 国产精品成人久久久久久久 | bl无遮挡高h动漫 | 97在线播放免费观看 | 亚洲av无码一区二区三区四区 | 少妇综合网 | 特级大胆西西4444人体 | 欧美成人h版 | 久久久一区二区三区四区 | 婷婷亚洲激情 | 秋霞福利网| 黄色三级小视频 | 少妇精品无码一区二区三区 | 欧美五月婷婷 | 完美搭档在线观看 | 久久成人福利视频 | japansexxxxhd医生 夜夜操导航 | 欧美性猛交bbbbb精品 | 国产男女在线 | 欧美日本中文 | 最近中文字幕在线中文视频 | 天天干天天天 | 人人草人人搞 | 自拍偷拍亚洲综合 | 亚洲插插| www.久久 | 天天操妹子 | 精品久久在线 | 国产无遮挡裸体免费视频 | 亚洲高清自拍 | 欧美日韩精品一区二区在线观看 | 97国产精品人人爽人人做 | 亚洲美女啪啪 | 日韩精品视频观看 | 中文字幕在线视频播放 | 欧美黄色特级视频 | 久久精品欧美日韩精品 | 久久久精品一区二区涩爱 | 国产精品久久久久久久久动漫 | 欧美成人二区 | 欧洲性生活片 | 国产午夜无码精品免费看奶水 | jlzzjizz在线播放观看 | 亚洲爱爱av | 日韩在线观看精品 | 69久久 | 韩国女主播一区二区 | 国产在线视频福利 | 在线观看h视频 | 亚洲一区二区伦理 | 成人动漫中文字幕 | 91欧美日韩 | av男人的天堂在线 | 日韩一级片网站 |