终于把这几种排序算法写好啦,哈哈哈,记录一下头文件。
#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位进行排序