#include <cstdio>
#include <iostream>
using namespace std;
//c++11 使用
bool rule1(int a, int b){
return a<b;
}
bool rule2(int a, int b){
return a>b;
}
void swap(auto &a, auto &b){
auto tem = a;
a = b;
b = tem;
}
//my quick sort start 1
int find_mid(auto *a, int l, int r, bool(*cmp)(auto, auto) ){
int mid = (l+r)/2;
if( (cmp(a[l], a[mid]) && cmp(a[mid], a[r]) ) || (!cmp(a[l], a[mid]) && !cmp(a[mid], a[r]) ) ) return mid;
else if( (cmp(a[mid], a[l]) && cmp(a[l], a[r]) ) || (!cmp(a[mid], a[l]) && !cmp(a[l], a[r]) ) ) return l;
return r;
}
int partition(auto *a, int l, int r, bool(*cmp)(auto, auto) ){
int mid = find_mid(a, l, r, cmp);
swap(a[mid], a[r]);
int i, j;
for(i=l, j=l; i<r; ++i){
if( cmp(a[i], a[r]) ){
if(i!=j) swap(a[i], a[j]);
++j;
}
}
swap(a[j], a[r]);
return j;
}
void quick_sort(auto *a, int l, int r, bool(*cmp)(auto, auto) ){
//quick sort algorithm
if(l >= r) return;
int mid = partition(a, l, r, cmp);
quick_sort(a, l, mid-1, cmp);
quick_sort(a, mid+1, r, cmp);
}
//my quick sort end
//my heap sort start 2
int parent(int i){
return i/2; }
int left(int i){
return i*2; }
int right(int i){
return i*2+1; }
void heapity(auto *a, int asize ,int i, bool(*cmp)(auto, auto) ){
int l = left(i);
int r = right(i);
int largest;
if(l<=asize && cmp(a[i], a[l]) ) largest = l;//堆排序中若 a 应排在 b 前面,建堆时应将 b 排在 a 前面
else largest = i;
if(r<=asize && cmp(a[largest], a[r])) largest = r;
if(largest != i){
swap(a[largest], a[i]);
heapity(a, asize, largest, cmp);
}
十大排序算法C++实现(C++11)
最新推荐文章于 2022-04-18 11:09:50 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)