在下学识浅薄,如下有一些主流排序方法,供诸君参考借鉴。
1.桶排序
性能:稳定,快速,牺牲空间换取时间,易于去重;
重点:以数组下标储存数据,以元素累计个数;
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
int x[10000]={0};
int y[10000];
int i,n;
cin>>n;
for(i=0;i<n;i++)
{
scanf("%d",&y[i]);
x[y[i]]++;
}
for(i=0;i<10000;i++)
{
if(x[i])
{
printf("%d ",i);
}
}
cout<<endl;
return 0;
}
2.快速排序
性能:相较之下最实用快速的排序方法
重点:理解基准 分治的思想
1.C++<algorithm>文件下的使用方法
使用sort函数 sort( start , end , way ); way默认为从小到大排序
若想使其从大到小排序,可以构造一个bool类型的比较函数
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
bool compare(int a,int b)
{
return a>b;
}
int main()
{
int n,i;
int x[10000];
cin>>n;
for(i=0;i<n;i++)
{
cin>>x[i];
}
sort(x,x+n,compare);
for(i=0;i<n;i++)
{
cout<<x[i]<<' ';
}
cout<<endl;
return 0;
}
2. 构造函数quicksort 进行快速排序 伪代码如下:
void quicksort(int x[],int start,int finall)
{
/*从小到大*/
if(start < finall)
{
int i = start,j = finall,base = x[start];
/*i 指向前端 j 指向末尾 基准数选择为 第一个数*/
while(i < j)
{
while(i<j && x[j] >= base)
{
j--;
}
/*找到小于基准数的*/
if(i<j)
{
x[i++]=x[j];
}
while(i<j && x[i] <= base)
{
i++;
}
/*找到大于基准数的*/
if(i<j)
{
x[j--]=x[i];
}
}
x[i]=base;
/*将基准数放置于中*/
quicksort(x,start,i-1);
quicksort(x,i+1,finall);
/*不断递归进行此操作*/
}
}
3.归并排序
性能:亦是基于分治思想上的排序算法
重点:1.划分区域,尽可能平均 2.递归求解 3.有序表合并
#include <cstdio>
#include <iostream>
using namespace std;
/* merge sort*/
void mergesort(int *A,int x,int y,int *T)
{
if(y-x > 1)
{
int m = x + (y-x)/2;
/*划分*/
int p=x,q=m,i=x;
mergesort(A,x,m,T);
mergesort(A,m,y,T);
/*进行递归求解*/
while(p<m || q<y)
{
if(q >=y || (p<m && A[p] <=A[q]))
{
T[i++] = A[p++];
}
else
{
T[i++] = A[q++];
}
/*数组置于临时空间*/
}
for(i=x; i<y; i++)
{
A[i] = T[i];
}
/*临时空间置回数组*/
}
}
int main()
{
int x[10000];
int y[10000];
int i,n;
cin>>n;
for(i=0;i<n;i++)
{
cin>>x[i];
}
mergesort(x,0,n,y);
for(i=0;i<n;i++)
{
cout<<x[i]<<' ';
}
cout<<endl;
return 0;
}