锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
for (j = i; j > 0 ; j--)
if(x[i] > x[j]) swap(i,j)
for (j = i; j > 0 && x[j-1] > x[j]; j--)
swap(j-1,j)
template<typename RandomAccessIterator>
void insert_sort(RandomAccessIterator first, RandomAccessIterator last)
{
if(first == last) return;
for(RandomAccessIterator i = first+1; i != last; ++i) //鎷胯搗妗屽瓙涓婄殑鐗岋紝浠巉irst+1寮濮嬫嬁鏄洜涓哄彧鏈変竴寮犵殑璇濓紝鏈韓灝辨湁搴忎簡銆?br /> linear_insert(first, i, value_type(first)); //緇欐嬁璧鋒潵鐨勭墝鎺掑簭錛屼粠鍙沖線宸︽彃鍏ャ?br />}
template<typename RandomAccessIterator>
inline void linear_insert(RandomAccessIterator first, RandomAccessIterator last,
T* )
{
T value = *last;
if(value < *first){ //鏈鍙寵竟鐨勫兼瘮鏈宸﹁竟鐨勫艱繕瑕佸ぇ錛岄偅灝辨妸鏈鍙寵竟鐨勭墝鏀懼湪鏈鍓嶉潰錛屽洜姝ゅ叾浠栫殑鐗屼緷嬈″悜鍚庯紙鍙寵竟錛夌Щ鍔ㄣ?br /> std::copy_backward(first, last, first+1); //鍏朵粬鐨勭墝渚濇鍚戝悗錛堝彸杈癸級縐誨姩錛屽皢絎竴涓綅緗暀緇欐柊鐗屻?br /> *first = value; //鎶婃柊鐨勭墝鏀懼湪絎竴涓綅緗?br /> }
else{
unguarded_linear_insert(last, value); //渚濇綰挎х殑浠庡彸寰宸︽瘮杈冿紝璁╂柊鐗岃嚜宸卞幓鎵句釜鍚堥傜殑浣嶇疆銆?br /> }
}
template<typename RandomAccessIterator>
inline void unguarded_linear_insert(RandomAccessIterator last, T value)
{
RandomAccessIterator next = last;
--next;
while(value < *next){ //涓涓竴涓殑鏉ユ瘮杈冿紝濡傛灉鏂扮墝姣旇緝澶э紝灝卞拰鑰佺殑鐗屾崲涓涓嬩綅緗?br /> *last = *next;
last = next;
--next;
}
*last = value;
/*
//Or we can make it like this:
RandomAccessIterator position = find(last, first, less_than(*last));
swap(value, copy(position, last,position+1) );
*/
}
蹇熸帓搴忎吉浠g爜錛?br />
if lower >= uper then
return
middle = lower
for i = [lower+1, uper]
if x[i] < x[l] then
swap(++middle, i)
swap(lower, middle)
qsort(lower, middle-1)
qsort(middle+1, uper)
瀹為檯浠g爜錛屼箣鍚庨噸鏂板畾鍒朵簡榪欎釜綆楁硶錛屼嬌鐢ㄥ弻杈瑰揩鎺掞細
#include <bits/stl_iterator_base_types.h>
#include <algorithm>
template<typename RandomAccessIterator>
void qsort(RandomAccessIterator first, RandomAccessIterator last){
if( first == last ) return;
typename std::iterator_traits<RandomAccessIterator>::value_type tmp = *first;// *(last - 1);
RandomAccessIterator left = first;
RandomAccessIterator right = last;
while(true){
while(*left < tmp) ++left;
--right;
while(*right > tmp) --right;
if(right - left < 1) break;
std::swap(*left, *right);//iter_swap(leftm, right);
++left;
}
//std::swap(*first,*right); 榪欎釜浜ゆ崲鍙互鎹㈠緱姣旇緝紼沖畾鐨勬椂闂村鏉傚害錛屼絾鏄湁浜涙儏鍐典笅錛屾晥鐜囨病鏈夊幓鎺夋琛岄珮
qsort(first, left);
qsort(right+1, last);
}
int main(){
int x[10] = {5,6,8,4,9,1,3,7,6,33};
for(int i = 0; i < 9999999; ++i)
std::sort(x,x+10); //use time 2.272s
//qsort(x,x+10); //use time 4.072s
std::for_each(x, x+10, [](int tmp){
std::cout<<tmp<<" ";
});
return 0;
}
涓涓錛屽啓涓涓嚱鏁板皢絎竴涓弬鏁版墍鏈夌殑灝忓啓瀛楁瘝杞崲鎴愬ぇ鍐欏瓧姣嶏紝緇撴灉鏀懼湪絎簩涓弬鏁伴噷闈€傚嚱鏁板師鍨嬩負void transfer_up(const char *first, char *second);
杈撳叆闄愬埗涓篴-zA-Z
//鍗曚釜瀛楃灝忓啓杞崲涓哄ぇ鍐?/font>
return c & 0x5F ;
}
// c | 0x60涔熻,浣嗕笉澶ソ,鍥犱負0x60浼氭敼鍙樼粨鏋滅殑絎?浣嶅?鏍規嵁棰樼洰鎰忔?鏀瑰彉絎?浣嶅間負1,鑰屽叾瀹冧綅淇濇寔涓嶅彉灝卞浜嗐?/span>
return c | 0x20 ;
}
瀹屽叏鏂規
if(*first == '\0' || first == (char*)0 ){
second = 0;
return;
}
do{
if(*first > 'a' && *first < 'z')
*second++ = (*first) &0x5F; //鎴栬卻tatic int delta = 'A' - 'a'; *second++ = *first + delta;
}while(*錛?+first錛?!= '\0');
*second = '\0';
}
]]>
鏂規1錛?/font>棣栧厛灝唍鐨勫墠i涓暟緇勫鍒跺埌涓涓復鏃舵暟緇勪腑錛岀劧鍚庡皢鍓╀綑涓嬬殑n-i涓厓绱犲悜宸︾Щ鍔╥涓綅緗紝鏈鍚庡皢鏈鍒濈殑i涓厓绱犲瓨鍌ㄥ湪涓存椂鏁扮粍涓殑鍐呭澶嶅埗鍒皀涓綑涓嬬殑浣嶇疆銆?br />
榪欎釜鏂規浜х敓榪囧ぇ鐨勫瓨鍌ㄧ┖闂存秷鑰椼?/span>
鏂規2錛?/font>瀹氫箟涓涓嚱鏁板皢n鍚戝乏鏃嬭漿涓涓綅緗紝鐒跺悗璋冪敤璇ュ嚱鏁癷嬈°?br />
璇ユ柟娉曚駭鐢熻繃澶氱殑鏃墮棿娑堣?/span>
鏂規3錛?/font>灝嗛棶棰樼湅浣滄槸浜ゆ崲鍚戦噺AB鐨勪袱孌碉紝寰楀埌鍚戦噺BA銆傝繖閲孉浠h〃n涓殑鍓峣涓厓绱?鍋囪A姣擝鐭紝灝咮鍒嗕負Bl鍜孊r,浣垮緱Br鍏鋒湁鍜孉鐩稿悓鐨勯暱搴?浜ゆ崲A錛孊r錛屽緱鍒癇rBlA錛孉鏀懼埌浜嗕粬闇瑕佺殑鏈緇堜綅緗?br />
鎺ヤ笅鏉ュ皢BrBl鐪嬩綔鏁翠綋,閲囩敤鍚屾牱鐨勫艦寮忥紝浜ゆ崲Br鍒癇l鍚庨潰錛岄掑綊瑙e喅
璇ユ柟妗堥潪甯鎬紭闆咃紝鏁堢巼涔熻凍澶熼珮銆備笉榪囬渶瑕佷綔鑰呭叿鏈夎緝濂界殑緙栫爜鑳藉姏
鏂規4錛?/font>灝嗛棶棰樼湅浣滄槸鎶婃暟緇凙B杞崲鎴怋A,鍚屾椂鍋囧畾鎴戜滑鎷ユ湁涓涓嚱鏁板彲浠ュ皢鏁扮粍涓殑鐗瑰畾閮ㄥ垎鐨勫厓绱犳眰閫嗐?br />
浠嶢B寮濮?------>瀵笰姹傞嗗緱鍒癆rB
abc | defgh-----------> cba | defgh
瀵笲姹傞?------->ArBr
cba | defgh---------->cba | hgfed
瀵硅寮忓瓙鏁翠綋姹傞?----------->(ArBr)r==BA
cba | hgfed---------->cbahgfed -----------> cbah | gfed---姹傞?-->defghabc (榪欏氨鏄垜浠鐨勭粨鏋?
鏈緇堝緱鍒癇A.
defghabc
浜庢槸鎴戜滑寰楀埌浜嗗涓嬩唬鐮?
reverse(i-1,n-1);/*閫嗚漿B*/
reverse(0,n-1);/*閫嗚漿ArBr*/
]]>