給有需要的人-十大排序算法下(歸併排序 快速排序 計數排序 桶排序(簡單版本) 基數排序)

小孱弱弱來補上前天的大坑,尤其要注意的是桶排序,這裏只介紹簡單版本,後面分享算法導論時,再深入寫寫。

#include <iostream>
#include <cstdlib>
#include <windows.h>
#include <time.h>
#include <vector> 
#include <algorithm>
#include <math.h>
#include <list>
using namespace std;
#define MAXN_QSORT 7
#define MAXN 10
vector<int>vecRaw(10,0); 
vector<int>vecObj(10,0); 
int pa[10];
//六、歸併排序 平均時間複雜度O(n*logn) 最壞時間複雜度O(n*logn) 
//空間複雜度 O(1) 穩定
//遞歸實現 
void Merge(int SR[],int TR[],int i,int m,int n)
{
	int j,k,l;
	for(j=m+1,k=i;i<=m&&j<=n;k++)
	{
		if(SR[i]<SR[j])
			TR[k]=SR[i++];
		else
			TR[k]=SR[j++];
	}
	if(i<=m)
	{
		for(l=0;l<=m-i;l++)
			TR[k+l]=SR[i+l];
		
	}
	if(j<=n)
	{
		for(l=0;l<=n-j;l++)
			TR[k+l]=SR[j+l];
	}
	
 } 
void MSort(int SR[],int TR1[],int s,int t)
{
	int m;
	int TR2[MAXN+1];
	if(s==t)
		TR1[s]=SR[s];
	else
	{ 
		m=(s+t)/2;
		MSort(SR,TR2,s,m);
		MSort(SR,TR2,m+1,t);
		
		Merge(TR2,TR1,s,m,t);
	}
	
}
void MergeSort(SqList *L)
{
	MSort(L->r,L->r,1,L->length);
}
//迭代實現 
void MergePass(int SR[],int TR[],int s,int n)
{
	int i=1,j;
	while(i<=n-2*s+1)//排除奇數的最後一位
	{
		Merge(SR,TR,i,i+s-1,i+2*s-1);
		i=i+s*2;
	}
	if(i<n-s+1)
		Merge(SR,TR,i,i+s-1,n);
	else
		for(j=i;j<=n;j++)
			TR[j]=SR[j];
	
}
void MergeSort2(SqList *L)
{
	int *TR=(int*)malloc(L->length*sizeof(int));
	
	int k=1;
	while(k<L->length)
	{
		MergePass(L->r,TR,k,L->length);
		k=2*k;
		MergePass(TR,L->r,k,L->length);
		k=2*k;
	}
	
} 
//七、快速排序 平均時間複雜度O(n*logn) 最壞時間複雜度O(n*n) 
//空間複雜度 O(logn) 不穩定
//三數去中法 
int Partition (SqList *L,int low,int high) 
{
	//int pivotkey=L->r[low];
	int pivotkey;
	int m=low+(high-low)/2;
	
	if(L->r[low]>L->r[high])
		swap(L,low,high);
	if(L->r[m]>L->r[high])
		swap(L,high,m);
	if(L->r[m]>L->r[low])
		swap(L,m,low);
	pivotkey=L->r[low]; 
	L->r[0]=pivotkey;//優化 
	while(low<high)
	{
		while(low<high&&L->r[high]>=pivotkey)
			high--;
		L->r[low]=L->r[high];//優化 
		swap(L,low,high);
		while(low<high&&L->r[low]<=pivotkey)
			low++;
		L->r[high]=L->r[low];//優化 
		swap(L,low,high);
		
	}
	L->r[low]=L->r[0];//優化 
	return low;
	
}
void QSort(SqList *L,int low ,int high)
{
	int pivot;
	if((high-low)>MAXN_QSORT)
	{
		while(low<high)//優化
		{
			pivot=Partition(L,low,high);
		
			QSort(L,low,pivot-1);
			low=pivot+1; 
		} 
//		pivot=Partition(L,low,high);
//	
//		QSort(L,low,pivot-1);
//		QSort(L,pivot+1,high);
		
	}
	else
		InsertSort(L);//小於長度閥,調用插入排序 

}
void QuickSort(SqList *L)
{
	QSort(L,1,L->length);
}
//八、計數排序 平均時間複雜度O(n+m) 最壞時間複雜度O(n+m) 
//空間複雜度 O(n+m) 穩定
void CountSort(vector<int>&vecRaw,vector <int>&vecObj)
{
	//待排容器爲空
	if(vecRaw.size()==0)
		return;
	//計數向量置空 
	int length=(*max_element(vecRaw.begin(),vecRaw.end()))+1;
	//max_element返回迭代器,用來求數組最大值 
	vector<int> vecCount(length,0);
	//統計每個鍵值出現的次數
	for(int i=0;i<vecRaw.size();i++)
		vecCount[vecRaw[i]]++; 
	//後面鍵值出現的位置爲前面所有鍵值出現的和
	for(int i=1;i<length;i++)
		vecCount[i]+=vecCount[i-1];
	//將鍵值放到目標位置 
	for(int i=vecRaw.size();i>0;i--)
		vecObj[--vecCount[vecRaw[i-1]]]=vecRaw[i-1]; 
	
}
//九、桶排序  平均時間複雜度O(n) 最壞時間複雜度O(n) 
//空間複雜度 O(m) 穩定
//簡單版本 
void bucketSort(int a[], int n)
{
	int j=0,b[101];
	for(int i=0;i<101;i++)
		b[i]=0;
	for(int i=0;i<n;i++)
	{
		b[a[i]]++;
	}
	for(int i=0;i<=100;i++)
	{
		if(b[i]!=0)
			a[j++]=i;
			
	}

}
//十、計數排序  平均時間複雜度O(n) 最壞時間複雜度O(n) 
//空間複雜度 O(m) 穩定
int maxbit(int data[],int n)//輔助函數 
{
	int maxdata=data[0];
	for(int i=1;i<n;i++)//最大數 
		if(maxdata<data[i])
			maxdata=data[i];
	//位數
	int d=1,p=10;
	while(maxdata>=p)
	{
		//p*=10;
		maxdata/=10;
		++d;
	}
	return d;
	
}
void radixSort(int data[],int n)
{
	int d=maxbit(data,n);
	int *temp=new int[n];
	int *count=new int[n];//計數器
	int i,j,k;
	int radix=1;
	for(i=1;i<=d;i++)
	{
		for(j=0;j<10;j++)
			count[j]=0;//計數器置空
		for(j=0;j<n;j++)
		{
			k=(data[j]/radix)%10;
			count[k]++;
		}
		for(j=1;j<=10;j++)
			count[j]=count[j-1]+count[j];
		for(j=n-1;j>=0;j--)
		{
			k=(data[j]/radix)%10;
			temp[count[k]-1]=data[j];
			count[k]--;
		}
		for(j=0;j<n;j++)
			data[j]=temp[j];
		radix=radix*10; 
		
	} 
	delete []temp;
	delete []count;
	
	
}

int main ()
{
	srand(time(NULL));
//	for(int i=0;i<vecRaw.size();i++)
//		vecRaw[i]=rand()%100+1;
//	CountSort(vecRaw,vecObj);
//	for(int i=0;i<vecObj.size();i++)
//		cout<<vecObj[i]<<' ';
	
	for(int i=0;i<10;i++)
		pa[i]=rand()%100+1;
	bucketSort(pa,10);

	for(int i=0;i<10;i++)
		cout<<pa[i]<<' ';
	
//	for(int i=0;i<10;i++)
//		pa[i]=rand()%100+1;
//	radixSort(pa,10);
//	for(int i=0;i<10;i++)
//	cout<<pa[i]<<' ';
	
	 
	return 0;
 } 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章