1. 程式人生 > >7種排序演算法C++實現(標頭檔案)

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位進行排序