7种排序算法C++实现(头文件)

终于把这几种排序算法写好啦,哈哈哈,记录一下头文件。

#include<iostream>
#include"func.h"
using namespace std;

class sort {
public:
	void bubblesort(int *a, int n);
	void selectsort(int *a, int n);
	void mergesort(int *a, int first, int last);
	void Quicksort(int *a, int left, int right);
	void insertsort(int *a, int n);
	void heapsort(int *a, int n);
	void radixsort(int *a, int n, int k, int bit);
private:
	int *a;
	int n;
	int left, right;//用于归并排序和快排
	int k, bit;//用于基数排序
};

void sort::bubblesort(int *a, int n) {
	if(n<=0) return ;
	for(int i=0;i<n;i++) {
		for(int j=0;j<n-i-1;j++) {
			if(a[j]>a[j+1]) swap(a[j],a[j+1]);
		}
	}
	return ;
}

void sort::selectsort(int *a, int n) {
	if(n<=0) return ;
	for(int i=0;i<n;i++) {
		int min=INT_MAX;
		int pos;
		for(int j=i;j<n;j++) {
			if(a[j]<min) {
				min=a[j];
				pos=j;
			}
		}
		swap(a[i],a[pos]);
	}
	return ;
}

void sort::mergesort(int *a, int first, int last) {
	if(first>=last) return;
	int mid=(first+last)/2;
	mergesort(a, first, mid);
	mergesort(a, mid+1, last);
	merge(a, first, mid, last);
} 

void sort::Quicksort(int *a, int left, int right) {
	if(left>=right) return;
	int temp=a[left], i=left, j=right;
	if(left<right) {
		while(i<j) {
			while(i<j && a[j]>=temp) j--;
			while(i<j && a[i]<=temp) i++;
			swap(a[i],a[j]);
		}
		swap(a[left],a[i]);
	}
	Quicksort(a, left, i-1);
	Quicksort(a, i+1, right);
}

void sort::insertsort(int *a, int n) {
	if(n<=1) return ;
	for(int i=1;i<n;i++) {
		for(int j=i;j>=1;j--) {
			if(a[j]>=a[j-1]) break;
			else
				swap(a[j],a[j-1]);
		}
	}
}

void sort::heapsort(int *a, int n) {
	makeheap(a, n);
	int *b=new int[n]();
	for(int i=0;i<n;i++) {
		b[n-i-1]=a[0];
		swap(a[0],a[n-i-1]);
		makeheap(a, n-i-1);
	}
	for(int i=0;i<n;i++)
		a[i]=b[i];
	delete []b;
} 

void sort::radixsort(int *a, int n, int k, int bit) {
	for(int i=1; i<=bit;i++)
		countsort(a, n, k, i);
}

#include<iostream>
using namespace std;

void swap(int &a, int &b) {
	int c=a;
	a=b;
	b=c;
}

void merge(int *a, int first, int mid, int last) {
	int *b=new int[last-first+1];
	int a1_first=first, a1_last=mid;
	int a2_first=mid+1, a2_last=last;
	int k=0;
	while(a1_first<=a1_last && a2_first<=a2_last) {
		if(a[a1_first]<a[a2_first]) {
			b[k++]=a[a1_first++];
		}
		if(a[a1_first]>=a[a2_first])
			b[k++]=a[a2_first++];
	}
	while(a1_first<=a1_last) b[k++]=a[a1_first++];
	while(a2_first<=a2_last) b[k++]=a[a2_first++];
	for(int i=first;i<=last;i++) 
		a[i]=b[i-first];
	return ;
}

void makeheap(int *a, int n) {
	if(n<=1) return ;
	for(int i=n-1;i>=0;i--) {
		if(a[(i-1)/2]<a[i]) swap(a[(i-1)/2], a[i]);
	}
}

int kthbit(int number, int k) {
	int pow=1;
	while(k-->0) pow*=10;
	int res=(number%pow-number%(pow/10))/(pow/10);
	return res;
}

void countsort(int *a, int n, int k, int bit) {
	int *b=new int[k]();
	int *c=new int[n];
	for(int i=0;i<n;i++) {
		b[kthbit(a[i],bit)]++;
	}
	for(int i=1;i<k;i++)
		b[i]+=b[i-1];
	for(int i=n-1;i>=0;i--) {
		b[kthbit(a[i],bit)]--;
		c[b[kthbit(a[i],bit)]]=a[i];		
	}
	for(int i=0;i<n;i++)
		a[i]=c[i];
	delete []b;
	delete []c;
}//每一位数都小于k,按照第bit位进行排序

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值