快排的優化 參照SGI STL sort

2021-10-04 21:48:55 字數 1316 閱讀 1497

快排,大家都知道,時間複雜度最好情況是o(nlogn),最差情況是o(n²),雖然平均情況下是o(nlogn)中最好的,因為係數 k 比較小,但是最差情況卻讓我們直搖頭,所以還有優化的空間。

快排的兩個優化點:

1、當排序個數較少時,改為插入排序,減少遞迴的呼叫次數

2、當有惡化為最差情況時,改用堆排序

接下來我們來看 sgi stl sort 是怎麼根據這兩點做優化的:

template

<

class

randomaccessiter

>

inline

void

sort

(randomaccessiter first,

randomaccessiter last)

}// 對2取log向下取整

template

<

class

size

>

inline size __lg

(size n)

template

<

class

_randomaccessiter

,class

_tp,

class

_size

>

void

__introsort_loop

(_randomaccessiter __first,

_randomaccessiter __last, _tp*

, _size __depth_limit)

--__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 來控制遞迴的深度,超過後改用插入排序;利用 __depth_limit 來比較現狀與最好情況,當惡化時,即改用堆排序。

快排及優化

快速排序的本質就是選取乙個基準數,通過一次快排把基準數大的都放在基準數的左邊,把比基準數小的放在基準數的右邊,這樣就找到了基準數在陣列中的正確位置。然後可以用遞迴的方式分別對前半部分和後半部分排序,最終實現整體陣列有序。所謂排序的穩定性,就是指在排序過程中,在對某關鍵字排序後會不會改變其他關鍵字的順...

快排優化 1

include define max 100 儲存的最大值 void swap int a,int b int numberofthree int arr,int head,int end if arr head arr end if arr mid arr head 此時,arr mid arr ...

快排的幾種優化方案

先來複習下找基準的方法 public static int partion int arr,int start,int end if start end else while start end arr start tmp if start end else arr start tmp return...