這幾天在讀程杰的《大話資料結構》,上面有介紹快速排序演算法。關於排序演算法一直沒有下功夫研究過,全都是用現成的,這次花了點時間自己動手寫了寫,順便也檢驗了自己對 c++11 的掌握程度。
快速排序原理上很簡單,乙個陣列分成前後兩部分,保證前邊的數都比後面的小。之後遞迴的再這麼分下去就行了。
下面是**,首先需要乙個能交換兩個元素的 swap 函式,這個 swap 用到了 c++ 11 的 auto 關鍵字。說實話要是沒有 auto 這個**我還真不會寫。。。
template
inline
void swapvaluebyiterator(randomiterator p, randomiterator q)
之後要有個函式能將陣列分成前後兩部分,後面的比前面的大。
這個函式需要注意的是 end 開始時指向的是乙個最後乙個元素的下乙個元素,所以需要向前移動一下。之所以這樣設計是為了與 c++ 中的 iterator 一致。
template
randomiterator partition(randomiterator start, randomiterator end, lessthan func)
swapvaluebyiterator(start, end);
while(start != end && !func( *end, *start ))
swapvaluebyiterator(start, end);
}return start;
}
之後就是主角了:
templatevoid quicksort(randomiterator start, randomiterator end, lessthan func)
}
下面是個例子:
template
bool my_less(t& x, t& y)
template
void print( randomiterator start, randomiterator end)
cout
<< endl;
}int main(int argc, char *argv)
; print(std::begin(test), std::end(test));
quicksort(std::begin(test), std::end(test), my_less);
print(std::begin(test), std::end(test));
}
當然這個**還可以優化,比如陣列元素比較少時應該用 insertsort:
template
void insertsort(randomiterator start, randomiterator end, lessthan func)
}swapvaluebyiterator(start, min_pos);
}}const int insert_sort_n = 15;
template
void quicksort2(randomiterator start, randomiterator end, lessthan func)
else
}
quicksort 還可以寫成 尾遞迴的形式,我們知道編譯器會對尾遞迴進行優化。
template
void quicksort3(randomiterator start, randomiterator end, lessthan func)
}else
}
至此,乙個 quicksort 函式就基本完成了。當然還可以進一步的優化,不過那都是些細枝末節的優化了。對我們學習快速排序的原理意義不大。 自己寫的乙個快速排序
呵呵 今天沒事看了看 快速排序的基本思想後寫了乙個快排的demo 發到部落格上做個備份 public class quicksort public static void quicksort int l,int u int m l for int i l 1 i u i swap l,m quick...
自己寫的乙個快速排序
include stdafx.h include include include using namespace std define maxtcpconnect 1000 struct remotesockinfo struct mylist typedef mylist pmylist void...
C 寫演算法之快速排序
快速排序是從氣泡排序演變而來,快速排序之所以快,是因為使用了分治法。同氣泡排序一樣,快速排序也屬於交換排序,通過元素之間的比較和交換位置來達到排序的目的。快速排序是在每一輪挑選乙個基準元素,並讓其他比它大的元素移動到數列的一邊,比它曉得元素移動到數列的另一邊,從而把數列拆解成兩個部分。在分治法的思想...