甯哥敤鎺掑簭綆楁硶錛氬啋娉℃帓搴忥紝蹇熸帓搴忥紝褰掑茍鎺掑簭錛屾彃鍏ユ帓搴忥紝鍫嗘帓搴忥紝緇熻鎺掑簭銆?br />鍐掓場鎺掑簭浼唬鐮侊細(xì)
for i = [1,n)
for (j = i; j > 0 ; j--)
if(x[i] > x[j]) swap(i,j)
鎻掑叆鎺掑簭浼唬鐮侊細(xì)
for i = [1,n)
for (j = i; j > 0 && x[j-1] > x[j]; j--)
swap(j-1,j)
鍘熺悊鏄紝鎯寵薄鑷繁鍦ㄦ懜鐗岋紝鐗屾斁鍦ㄦ瀛愪笂錛屾垜浠瘡鎷胯搗涓寮狅紝鍏堝皢榪欏紶鐗屾斁鍦ㄦ渶鍙寵竟錛岀劧鍚庝笌鎵嬮噷鐨勭墝浠庡彸鍒板乏鐨勬瘮杈冿紝涓嬈′竴嬈$殑鍚戝墠浜ゆ崲錛岀洿鍒板埌杈懼悎閫傜殑浣嶇疆銆?br />瀹炵敤C++浠g爜錛?br />//insert_sort.cpp
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 />void qsort(lower, uper)
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爜錛屼箣鍚庨噸鏂板畾鍒朵簡榪欎釜綆楁硶錛屼嬌鐢ㄥ弻杈瑰揩鎺掞細(xì)
#include <iostream>
#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;
}
//紼嬪簭鐨勬墽琛屾椂闂村湪linux涓嬬殑嫻嬭瘯鏂瑰紡鏄痶ime a.out
涓涓錛屽啓涓涓嚱鏁板皢絎竴涓弬鏁版墍鏈夌殑灝忓啓瀛楁瘝杞崲鎴愬ぇ鍐欏瓧姣嶏紝緇撴灉鏀懼湪絎簩涓弬鏁伴噷闈€傚嚱鏁板師鍨嬩負(fù)void transfer_up(const char *first, char *second);
杈撳叆闄愬埗涓篴-zA-Z
//鍗曚釜瀛楃灝忓啓杞崲涓哄ぇ鍐?/font>
char toupper( char c){
return c & 0x5F ;
}
//鍗曚釜瀛楃澶у啓杞崲涓哄皬鍐?/font>
char tolower( char c) {
// c | 0x60涔熻,浣嗕笉澶ソ,鍥犱負(fù)0x60浼?xì)鏀瑰彉缁撴灉鐨劷W?浣嶅?鏍規(guī)嵁棰樼洰鎰忔?鏀瑰彉絎?浣嶅間負(fù)1,鑰屽叾瀹冧綅淇濇寔涓嶅彉灝卞浜嗐?/span>
return c | 0x20 ;
}
瀹屽叏鏂規(guī)
void transfer_up(const char *first, char *second){
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';
}
閭d箞澶у啓杞皬鍐欎篃鏄悓鏍風(fēng)殑閬撶悊浜嗐備笉榪囨槸鍚?x20姹備笌銆?br />

]]>