#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);
}
}
void build_heap(auto *a, int asize, bool(*cmp)(auto, auto) ){
for(int i=asize/2; i>0; --i){
heapity(a, asize, i, cmp);
}
}
void heap_sort(auto *a, int asize, bool(*cmp)(auto, auto) ){
//asize 为元素个数,数组中元素从1开始排列
build_heap(a, asize, cmp);
for(int i=asize; i>1; --i){
swap(a[i], a[1]);
heapity(a, i-1, 1, cmp);
}
}
//my heap sort end
//my counting sort start 3
void counting_sort(int *a, int asize, int k)//数组 a 中元素属于[0, k], 仅限于整数使用
{
int b[asize], c[k+1];
for(int i=0; i<=k; ++i) c[i] = 0;
for(int i=0; i<asize; ++i) c[a[i]] = c[a[i]] + 1;
int sum = 0;
for(int i=1; i<=k; ++i) c[i] += c[i-1];
for(int i=asize-1; i>=0; --i){
b[c[a[i]]-1] = a[i];
--c[a[i]];
}
for(int i=0; i<asize; ++i) a[i] = b[i];
}
//my counting sort end
//my radix sort start 4
void radix_sort(int *a, int asize, int d){
//仅限正整数使用, d为整数位数
const int k=9;
int b[asize], c[k+1];
int mod = 1, div = 1;
for(int j=1; j<=d; ++j){
div = mod;
mod *= 10;
for(int i=0; i<=k; ++i) c[i] = 0;
for(int i=0; i<asize; ++i) c[(a[i]%mod)/div] = c[(a[i]%mod)/div] + 1;
int sum = 0;
for(int i=1; i<=k; ++i) c[i] += c[i-1];
for(int i=asize-1; i>=0; --i){
b[c[(a[i]%mod)/div]-1] = a[i];
--c[(a[i]%mod)/div];
}
for(int i=0; i<asize; ++i) a[i] = b[i];
}
}
//my radix sort end
//my bucket sort start 适用于元素均匀分布的数组 5
typedef struct node nn;
struct node{
int key;
nn *next;
};
void bucket_sort(int *a, int asize, int mx){
int i, div = mx/asize, cnt = 0;
nn *b[asize];
for(i=0; i<asize; ++i){
nn *th = (nn*)malloc(sizeof(nn));
th->key = -1; th->next = 0;
b[i] = th;
}
for(i=0; i<asize; ++i){
int j = a[i]/div;//确定该数进哪个桶
nn *th = (nn*)malloc(sizeof(nn));
nn *tem = b[j];
th->key = a[i];
while(tem->next != 0){
if(a[i] <= tem->next->key) break;
tem = tem->next;
}
th->next = tem->next; tem->next = th;
}
nn *tem;
for(i=0; i<asize; ++i){
tem=b[i]->next;
while(tem != 0){
a[cnt++] = tem->key;
tem = tem->next;
}
}
}
//my bucket sort end
//my in sort start 6
void in_sort(auto *a, int asize, bool(*cmp)(auto, auto)){
int i, j;
for(i=1; i<asize; ++i){
auto tem = a[i];
for(j=i-1; j>=0; --j){
if(cmp(tem, a[j])) a[j+1] = a[j];
else break;
}
a[j+1] = tem;
}
}
//my in sort end
//my bubble sort start 7
void bubble_sort(auto *a, int asize, bool(*cmp)(auto, auto)){
for(int i=asize; i>1; --i){
int mx = 0;
for(int j=0; j<i-1; ++j){
if(!cmp(a[j], a[j+1])){
swap(a[j], a[j+1]);
}
}
}
}
//my bubble sort end
//my selection sort start 8
void selection_sort(auto *a, int asize, bool(*cmp)(auto, auto)){
for(int i=0; i<asize-1; ++i){
int mn = i;
for(int j=i+1; j<asize; ++j){
if(cmp(a[j], a[mn])) mn = j;
}
swap(a[i], a[mn]);
}
}
//my selection sort end
//my merge sort begin 9
void merge(auto *a, auto *b, int l, int mid, int r, bool(*cmp)(auto, auto)){
int i, j, cnt;
for(i=l, j=mid+1, cnt = l; cnt <= r; ++cnt){
if(i<=mid && j<=r){
if(cmp(a[i], a[j])){
b[cnt] = a[i++];
}else{
b[cnt] = a[j++];
}
}else if(i<=mid){
while(i<=mid) b[cnt++] = a[i++];
}else if(j<=r){
while(j<=r) b[cnt++] = a[j++];
}
}
for(i=l; i<=r; ++i) a[i] = b[i];
}
void merge_sort(auto *a, auto *b, int l, int r, bool(*cmp)(auto, auto)){
if(l<r){
int mid = (l+r)/2;
merge_sort(a, b, l, mid, cmp);
merge_sort(a, b, mid+1, r, cmp);
merge(a, b, l, mid, r, cmp);
}
}
//my merge sort end
//my shell sort start 10
void shell_sort(auto *a, int asize, bool(*cmp)(auto, auto)){
for(int len = asize/2; len>=1; len/=2){
for(int i=0; i<len; ++i){
//in sort
int j, ans;
for(j=i+len; j<asize; j+=len){
auto tem = a[j];
for(ans=j-len; ans>=i; ans-=len){
if(cmp(tem, a[ans])) a[ans+len] = a[ans];
else break;
}
a[ans+len] = tem;
}
//in sort
}
}
}
//my shell sort end
int main()
{
int a[21] = {
0, 3, 2, 11, 11, 15, 28, 15, 9, 12, 24, 4, 23, 15, 12, 3, 1, 5, 0, 9, 25};
int b[21];
merge_sort(a, b, 0, 20, rule2);
printf("merge_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
merge_sort(a, b, 0, 20, rule1);
printf("merge_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
quick_sort(a, 0, 20, rule2);
printf("quick_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
quick_sort(a, 0, 20, rule1);
printf("quick_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
in_sort(a, 21, rule2);
printf("in_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
in_sort(a, 21, rule1);
printf("in_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
shell_sort(a, 21, rule2);
printf("shell_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
shell_sort(a, 21, rule1);
printf("shell_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
bubble_sort(a, 21, rule2);
printf("bubble_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
bubble_sort(a, 21, rule1);
printf("bubble_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
selection_sort(a, 21, rule2);
printf("selection_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
selection_sort(a, 21, rule1);
printf("selection_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
heap_sort(a, 20, rule1);//排[1, 20]
printf("heap_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
heap_sort(a, 20, rule2);//排[1, 20]
printf("heap_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
counting_sort(a, 21, 30);
printf("counting_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
radix_sort(a, 21, 2);
printf("radix_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
bucket_sort(a, 21, 50);
printf("bucket_sort\n");
for(int i=0; i<21; ++i) printf("%d ", a[i]);
printf("\n");
return 0;
}
十大排序算法C++实现(C++11)
猜你喜欢
转载自blog.csdn.net/weixin_44182138/article/details/104739205
今日推荐
周排行