@CrazyHenry
2018-03-07T09:39:36.000000Z
字数 4186
阅读 1256
dddd数据结构课本
- Author:李英民 | Henry
- E-mail: li
_yingmin@outlookdotcom- Home: https://liyingmin.wixsite.com/henry
快速了解我: About Me
转载请保留上述引用内容,谢谢配合!

#include <iostream>#include <string>#include <vector>#include <iterator>#include <algorithm>#include <typeinfo>#include <numeric>#include <memory>#include <stdexcept>#include <fstream>#include <sstream>using namespace std;//win+<-/-> 切换窗口位置//ctrl+win+<-/->切换桌面//ctrl+alt+上/下 改变显示器方向template <typename T>int __partition(T arr[], int l, int r){T v = arr[l];int j = l + 1; // arr[l+1...j) < v ; arr[j...i) >= vfor( int i = l + 1 ; i != r ; i ++ )if( arr[i] < v ){swap( arr[j++] , arr[i] );}swap( arr[l] , arr[--j]);//轴值要与j左边的那个<v的元素交换//返回轴值的位置return j;}// 对arr[l...r]部分进行快速排序template <typename T>void __quickSort(T arr[], int l, int r){if( l >= r-1 ) //这里递归到底可以使用直接插入排序return;int p = __partition(arr, l, r);__quickSort(arr, l, p );__quickSort(arr, p+1, r);}template <typename T>void quickSort(T arr[], int n){__quickSort(arr, 0, n);}int main() {int a[20] = {120,9,8,7,6,5,4,3,2,1,10,9,8,7,6,5,4,3,2,1};quickSort(a,20);for( int i = 0 ; i < 20 ; ++i )cout<<a[i]<<ends;cout<<endl;return 0;}
#include <iostream>#include <string>#include <vector>#include <iterator>#include <algorithm>#include <typeinfo>#include <numeric>#include <memory>#include <stdexcept>#include <fstream>#include <sstream>#include <random>using namespace std;//win+<-/-> 切换窗口位置//ctrl+win+<-/->切换桌面//ctrl+alt+上/下 改变显示器方向template <typename T>int __partition(T arr[], int l, int r){static default_random_engine e;//分布类型不能用static,因为每次调用的时候都需要修改l和r-1uniform_int_distribution<unsigned> u(l,r-1);//C++的随机数引擎swap(arr[l], arr[u(e)]);T v = arr[l];int j = l + 1; // arr[l+1...j) < v ; arr[j...i) >= vfor( int i = l + 1 ; i != r ; ++i )if( arr[i] < v ){swap( arr[j++] , arr[i] );}swap( arr[l] , arr[--j]);return j;}// 对arr[l...r]部分进行快速排序template <typename T>void __quickSort(T arr[], int l, int r){if( l >= r-1 )return;int p = __partition(arr, l, r);__quickSort(arr, l, p );__quickSort(arr, p+1, r);}template <typename T>void quickSort(T arr[], int n){__quickSort(arr, 0, n);}int main() {int a[20] = {120,9,8,7,6,5,4,3,2,1,10,9,8,7,6,5,4,3,2,1};quickSort(a,20);for( int i = 0 ; i < 20 ; ++i)cout<<a[i]<<ends;cout<<endl;return 0;}
略,意义不大,性能不及三路。

template <typename T>pair<int,int> __partition(T arr[], int l, int r){T v = arr[l];int lt = l + 1; // arr[l+1...lt) < vint gt = r; // arr[gt...r) > vint i = l+1; // arr[lt+1...i) == vwhile( i != gt ){if( arr[i] < v ){swap( arr[i++], arr[lt++]);}else if( arr[i] > v ){swap( arr[i], arr[--gt]);}else{ // arr[i] == v++i;}}swap( arr[l] , arr[--lt] );return {lt,gt};}// 递归的三路快速排序算法template <typename T>void __quickSort3Ways(T arr[], int l, int r){if( l >= r-1 ) //一定要考虑到r==l的情况也可能发生,直接returnreturn;auto p = __partition(arr, l, r);__quickSort3Ways(arr, l, p.first);__quickSort3Ways(arr, p.second, r);}template <typename T>void quickSort3Ways(T arr[], int n){__quickSort3Ways( arr, 0, n);}int main() {int a[20] = {120,9,8,7,6,5,4,3,2,1,10,9,8,7,6,5,4,3,2,1};quickSort3Ways(a,20);for( int i = 0 ; i < 20 ; ++i )cout<<a[i]<<ends;cout<<endl;return 0;}
#include <iostream>#include <string>#include <vector>#include <iterator>#include <algorithm>#include <typeinfo>#include <numeric>#include <memory>#include <stdexcept>#include <fstream>#include <utility>#include <sstream>#include <random>using namespace std;//win+<-/-> 切换窗口位置//ctrl+win+<-/->切换桌面//ctrl+alt+上/下 改变显示器方向template <typename T>pair<int,int> __partition(T arr[], int l, int r){static default_random_engine e;uniform_int_distribution<unsigned> u(l,r-1);//C++的随机数引擎swap(arr[l], arr[u(e)]);T v = arr[l];int lt = l + 1; // arr[l+1...lt) < vint gt = r; // arr[gt...r) > vint i = l+1; // arr[lt+1...i) == vwhile( i != gt ){if( arr[i] < v ){swap( arr[i++], arr[lt++]);}else if( arr[i] > v ){swap( arr[i], arr[--gt]);}else{ // arr[i] == v++i;}}swap( arr[l] , arr[--lt] );return {lt,gt};}// 递归的三路快速排序算法template <typename T>void __quickSort3Ways(T arr[], int l, int r){// 对于小规模数组, 可以使用插入排序进行优化//if( r-l <= 1) return;if(r - l <= 10)//少于10个数{if(l == r) return;//0个元素for(int i = l + 1; i != r; ++i){int temp = arr[i];int j = 0;//初始化for(j = i; j != l && temp < arr[j - 1]; --j){arr[j] = arr[j - 1];}arr[j] = temp;}return;}auto p = __partition(arr, l, r);__quickSort3Ways(arr, l, p.first);__quickSort3Ways(arr, p.second, r);}template <typename T>void quickSort3Ways(T arr[], int n){__quickSort3Ways( arr, 0, n);}int main() {int a[40] = {120,9,8,7,6,5,4,3,2,1,10,9,8,7,6,5,4,3,2,1,120,9,8,7,6,5,4,3,2,1,10,9,8,7,6,5,4,3,2,1};quickSort3Ways(a,40);for( int i = 0 ; i < 40 ; ++i )cout<<a[i]<<ends;cout<<endl;return 0;}