各种排序算法实现——基数排序、归并排序、插入排序、冒泡排序、选择排序、快速排序、堆排序、希尔排序

各种排序算法总结见http://blog.csdn.net/huahuahailang/article/details/8716434

 

一、基数排序

#include<iostream>
#include<time.h>
using namespace std;
#define N 13 //取13个数字
#define d 3 //3位数字
#define K 10 //10个筒子
void RadixSort(int num[])
{ 
	int i,j,k; 
	int rate=1; 
	int C[N]; 
	int B[N];
	for (i=0;i<d;i++) 
	{
		for (j=0;j<K;j++)
		{ 
			C[j]=0;
		}
		for (j=0;j<N;j++)
		{ 
			k=num[j]/rate%10;//取出最后一位数字 
			C[k]++; 
		}
		for (j=1;j<K;j++) 
		{
			C[j] = C[j]+C[j-1];
		}
		for (j=N-1;j>=0;j--)
		{
			k=num[j]/rate%10; 
			B[C[k]-1]=num[j]; 
			C[k]--; 
		}
		cout<<"第 "<<i+1<<" 趟数据收集为:"<<endl;
		for (j=0;j<N;j++)
		{
			num[j]=B[j]; cout<<B[j]<<" ";
		}
		cout<<endl; rate *=10; 
	}
}
int main(int argc,char *argv[])
{ 
	int i;
	int temp=1; 
	int num[N];
	srand((unsigned) time(NULL)); 
	for (i=0;i<d;i++) 
	{
		temp *= 10; 
	}
	for (i=0;i<N;i++) 
	{ 
		num[i]=rand()%temp;
	}
	cout<<"排序之前数组中的数字为:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<" "; 
	} 
	cout<<endl<<endl;
	RadixSort(num);
	cout<<endl<<"使用基数排序之后:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<" "; 
	}
	cout<<endl;
	return 0;
}
	



 二、归并排序

#include<iostream>
#include<time.h>
using namespace std;
#define N 13 //取13个数字
#define d 2  // 数字的最大位数
void merge(int num[],int p,int q,int r)
{
	int n1,n2,i,j,k;
	int L[N];
	int R[N];
	n1=q-p+1;
	n2=r-q;
	for (i=0;i<n1;i++)
	{
		L[i]=num[p+i];
	}
	for (j=0;j<n2;j++)
	{
		R[j]=num[q+1+j];
	}
	k=p;
	i=0;
	j=0;
	while ((k<r)&&(i<n1)&&(j<n2))
	{
		if (L[i]<=R[j])
		{
			num[k]=L[i];
			i++;
		}
		else
		{
			num[k]=R[j];
			j++;
		}
		k++;
	}
	while (i<n1)
	{
		num[k++]=L[i++];
	}
	while (j<n2)
	{
		num[k++]=R[j++];
	}
}
void merge_sort(int num[],int p,int r)
{
	int q;
	if (p<r)
	{
		q=(p+r)/2;
		merge_sort(num,p,q);
		merge_sort(num,q+1,r);
		merge(num,p,q,r);
	}
}
int main(int argc,char *argv[])
{
	int i;
	int temp=1;
	int num[N];
	srand((unsigned) time(NULL));
	for (i=0;i<d;i++)
	{
		temp *= 10;
	}
	for (i=0;i<N;i++)
	{
		num[i]=rand()%temp;
	}
	cout<<"随机生成的排序之前数组中的数字为:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl<<endl;;
	
	merge_sort(num,0,N-1);
	cout<<endl<<"使用归并排序之后:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl;
	return 0;
}


三、插入排序

#include<iostream>
#include<time.h>
using namespace std;
#define N 13 //取13个数字
#define d 2  // 数字的最大位数
void charu_sort(int num[])
{
	int i,j,k;
	int key;
	for (i=1;i<N;i++)
	{
		j=0;
		key=num[i];
		while (j<=i)
		{
			if (num[j]>key)
			{
				k=i;
				while (k>j)
				{
					num[k]=num[k-1];
					k--;
				}
				num[k]=key;
				break;
			}
			j++;
		}
	}
}
int main(int argc,char *argv[])
{
	int i;
	int temp=1;
	int num[N];
	srand((unsigned) time(NULL));
	for (i=0;i<d;i++)
	{
		temp *= 10;
	}
	for (i=0;i<N;i++)
	{
		num[i]=rand()%temp;
	}
	cout<<"随机生成的排序之前数组中的数字为:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl<<endl;;
	
	charu_sort(num);
	cout<<endl<<"使用插入排序之后:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl;
	return 0;
}

 

插入排序的另一种写法:

#include<iostream>
#include<time.h>
using namespace std;
#define N 13 //取13个数字
#define d 2  // 数字的最大位数
void charu_sort(int num[])
{
	int i,j;
	int key;
	for (i=1;i<N;i++)
	{
		key=num[i];
		j=i-1;
		while (j>=0&&key<num[j])
		{
			num[j+1]=num[j];
			j--;
		}
		num[j+1]=key;
	}
}
int main(int argc,char *argv[])
{
	int i;
	int temp=1;
	int num[N];
	srand((unsigned) time(NULL));
	for (i=0;i<d;i++)
	{
		temp *= 10;
	}
	for (i=0;i<N;i++)
	{
		num[i]=rand()%temp;
	}
	cout<<"随机生成的排序之前数组中的数字为:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl<<endl;;
	
	charu_sort(num);
	cout<<endl<<"使用插入排序之后:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl;
	return 0;
}

四、冒泡排序

#include<iostream>
#include<time.h>
using namespace std;
#define N 13 //取13个数字
#define d 2  // 数字的最大位数
void buffer_sort(int num[])
{
	int i,j;
	int temp;
	for (i=0;i<N-1;i++)
	{
		for (j=0;j<N-1-i;j++)
		{
			if (num[j]>num[j+1])
			{
				temp=num[j];
				num[j]=num[j+1];
				num[j+1]=temp;
			}
		}
	}
}
int main(int argc,char *argv[])
{
	int i;
	int temp=1;
	int num[N];
	srand((unsigned) time(NULL));
	for (i=0;i<d;i++)
	{
		temp *= 10;
	}
	for (i=0;i<N;i++)
	{
		num[i]=rand()%temp;
	}
	cout<<"随机生成的排序之前数组中的数字为:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl<<endl;;
	
	buffer_sort(num);
	cout<<endl<<"使用冒泡排序之后:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl;
	return 0;
}

 

五、选择排序

#include<iostream>
#include<time.h>
using namespace std;
#define N 13 //取13个数字
#define d 2  // 数字的最大位数
void choice_sort(int num[])
{
	int i,j,k;
	int temp;
	for (i=0;i<N-1;i++)
	{
		k=i;
		for (j=i+1;j<N;j++)
		{
			if (num[k]>num[j])
			{
				k=j;
			}
		}
		if (k!=i)
		{
			temp=num[i];
			num[i]=num[k];
			num[k]=temp;
		}
	}
}
int main(int argc,char *argv[])
{
	int i;
	int temp=1;
	int num[N];
	srand((unsigned) time(NULL));
	for (i=0;i<d;i++)
	{
		temp *= 10;
	}
	for (i=0;i<N;i++)
	{
		num[i]=rand()%temp;
	}
	cout<<"随机生成的排序之前数组中的数字为:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl<<endl;;
	
	choice_sort(num);
	cout<<endl<<"使用选择排序之后:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl;
	return 0;
}

 

 


六、快速排序

#include<iostream>
#include<time.h>
using namespace std;
#define N 13 //取13个数字
#define d 2  // 数字的最大位数
int Partition(int num[],int p,int r)
{
	int i,j;
	int X=num[p];
	i=p;
	j=r;
	while (i<j)
	{
		while (i<j&&num[j]>X)
		{
			j--;
		}
		num[i]=num[j];
		while (i<j&&num[i]<X)
		{
			i++;
		}

		num[j]=num[i];
	}
	num[i]=X;
	return i;
}
void quick_sort(int num[],int p,int r)
{
	int q;
	if (p<r)
	{
		q=Partition(num,p,r);
		quick_sort(num,p,q-1);   
		quick_sort(num,q+1,r);
	}
}
int main(int argc,char *argv[])
{
	int i;
	int temp=1;
	int num[N];
	srand((unsigned) time(NULL));
	for (i=0;i<d;i++)
	{
		temp *= 10;
	}
	for (i=0;i<N;i++)
	{
		num[i]=rand()%temp;
	}
	cout<<"随机生成的排序之前数组中的数字为:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl<<endl;;
	
	quick_sort(num,0,N-1);
	cout<<endl<<"使用快速排序之后:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<"  ";
	}
	cout<<endl;
	return 0;
}



七、希尔排序:

#include<iostream>
#include<time.h>
#define N 13 //取13个数字
#define d 2 //3位数字
using namespace std;
void ShellPass(int num[],int increment)
{
	int i,j;
	int temp;
	for (i=increment;i<N;i++)
	{
		if (num[i]<num[i-increment])
		{
			temp=num[i];
			j=i-increment;
			do 
			{
				num[j+increment]=num[j];
				j=j-increment;
			} while (j>0&&temp<num[j]);
			num[j+increment]=temp;
		}
	}
}
void ShellSort(int num[])
{ 
	int increment=N;//增量
	do 
	{
		increment =increment/3+1;
		ShellPass(num,increment);
	} while (increment>1);
}
int main(int argc,char *argv[])
{ 
	int i;
	int temp=1; 
	int num[N];
	srand((unsigned) time(NULL)); 
	for (i=0;i<d;i++) 
	{
		temp *= 10; 
	}
	for (i=0;i<N;i++) 
	{ 
		num[i]=rand()%temp;
	}
	cout<<"排序之前数组中的数字为:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<" "; 
	} 
	cout<<endl<<endl;
	ShellSort(num);
	cout<<endl<<"使用希尔排序之后:"<<endl;
	for (i=0;i<N;i++)
	{
		cout<<num[i]<<" "; 
	}
	cout<<endl;
	return 0;
}
	



 八、堆排序

//大根堆实现由小到大的排序

#include<iostream>
#include<time.h>
#define N 8 //取13个数字
#define d 2 //3位数字
using namespace std;
void MaxHeap(int num[],int i,int len)
{
	int temp;
	int larger=i;
	int left=2*i;
	int right=2*i+1;
	if (left<=len&&num[left]>num[i])
	{
		i=left;
	}
	if (right<=len&&num[right]>num[i])
	{
		i=right;
	}
	if (i!=larger)
	{
		temp=num[larger];
		num[larger]=num[i];
		num[i]=temp;
		MaxHeap(num,i,len);
	}
	
}
void BuildMaxHeap(int num[],int len)
{
	int i,j,temp;
	i=len/2;
	while (i>=1)
	{
		MaxHeap(num,i,len);
		i--;
	}
}
void HeapSort(int num[],int len)
{ 
	int i;
	int temp;
	BuildMaxHeap(num,len);
	for (i=len;i>=2;i--)//将大根堆调整。将n--.
	{
		temp=num[i];
		num[i]=num[1];
		num[1]=temp;
		len --;
		MaxHeap(num,1,len);
	}
}
int main(int argc,char *argv[])
{ 
	int i;
	int temp=1; 
	int num[N+1];
	int len=N;
	srand((unsigned) time(NULL)); 
	for (i=0;i<d;i++) 
	{
		temp *= 10; 
	}
	for (i=1;i<=N;i++) 
	{ 
		num[i]=rand()%temp;
	}
	cout<<"排序之前数组中的数字为:"<<endl;
	for (i=1;i<=N;i++)
	{
		cout<<num[i]<<" "; 
	} 
	cout<<endl<<endl;
	HeapSort(num,len);
	cout<<endl<<"使用堆排序之后:"<<endl;
	for (i=1;i<=N;i++)
	{
		cout<<num[i]<<" "; 
	}
	cout<<endl;
	return 0;
}

//小根堆实现由大到小的顺序排序

#include<iostream>
#include<time.h>
#define N 13 //取13个数字
#define d 2 //3位数字
using namespace std;
void MaxHeap(int num[],int i,int len)
{
	int temp;
	int larger=i;
	int left=2*i;
	int right=2*i+1;
	if (left<=len&&num[left]<num[i])
	{
		i=left;
	}
	if (right<=len&&num[right]<num[i])
	{
		i=right;
	}
	if (i!=larger)
	{
		temp=num[larger];
		num[larger]=num[i];
		num[i]=temp;
		MaxHeap(num,i,len);
	}

}
void BuildMaxHeap(int num[],int len)
{
	int i,j,temp;
	i=len/2;
	while (i>=1)
	{
		MaxHeap(num,i,len);
		i--;
	}
}
void HeapSort(int num[],int len)
{ 
	int i;
	int temp;
	BuildMaxHeap(num,len);
	for (i=len;i>=2;i--)//将大根堆调整。将n--.
	{
		temp=num[i];
		num[i]=num[1];
		num[1]=temp;
		len --;
		MaxHeap(num,1,len);
	}
}
int main(int argc,char *argv[])
{ 
	int i;
	int temp=1; 
	int num[N+1];
	int len=N;
	srand((unsigned) time(NULL)); 
	for (i=0;i<d;i++) 
	{
		temp *= 10; 
	}
	for (i=1;i<=N;i++) 
	{ 
		num[i]=rand()%temp;
	}
	cout<<"排序之前数组中的数字为:"<<endl;
	for (i=1;i<=N;i++)
	{
		cout<<num[i]<<" "; 
	} 
	cout<<endl<<endl;
	HeapSort(num,len);
	cout<<endl<<"使用堆排序之后:"<<endl;
	for (i=1;i<=N;i++)
	{
		cout<<num[i]<<" "; 
	}
	cout<<endl;
	return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值