各种排序算法总结见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;
}