十大排序算法C++实现(C++11)

#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;
} 

猜你喜欢

转载自blog.csdn.net/weixin_44182138/article/details/104739205