我寫的乙個 C 快速排序演算法

2021-08-20 03:31:24 字數 1919 閱讀 8190

這幾天在讀程杰的《大話資料結構》,上面有介紹快速排序演算法。關於排序演算法一直沒有下功夫研究過,全都是用現成的,這次花了點時間自己動手寫了寫,順便也檢驗了自己對 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 寫演算法之快速排序

快速排序是從氣泡排序演變而來,快速排序之所以快,是因為使用了分治法。同氣泡排序一樣,快速排序也屬於交換排序,通過元素之間的比較和交換位置來達到排序的目的。快速排序是在每一輪挑選乙個基準元素,並讓其他比它大的元素移動到數列的一邊,比它曉得元素移動到數列的另一邊,從而把數列拆解成兩個部分。在分治法的思想...