哈希排序(HashSort)
简单来说就是桶排,装桶。前提是要给定数据大小范围,比如待排序数组k中每个数大小为[0,n],这样就要开一个范围比[0,n]略大的数组如a[n+5]并清零,然后循环一遍,把待排序数组的每个数据k[i]所对应的a[k[i]]进行+1操作。最后再循环一边,如果a[i]>0,则输出a[i]个i。
未经优化情况下
·时间复杂度:O(n)
·空间复杂度:O(n)
代码如下
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,l,r; //n为待排序数据规模,[l,r]是每个数据大小范围
scanf("%d%d%d",&n,&l,&r);
int a[r-l+1+5]; //开一个比数据范围略大的数组用于装桶,注意由于是从数组下标是0开始的,最后输出还要加上一个下界
memset(a,0,sizeof(a));//初始化,不然程序可能会爆掉
for(int i=1;i<=n;i++){
int temp; //开一个临时变量存数据
scanf("%d",&temp);//在线算法,一边输入一边处理数据
if(l>0)//考虑左边界大于0情况
a[temp+l]++; //下标为当前输入数据值的数组元素+1,表示这个桶被多装一次
else //考虑左边界小于0的情况
a[temp-l]++;
}
for(int i=0;i<=r-l+1;i++)
if(a[i]>0) //如果a[i]不为0,即a[i]已经有出现过,输出a[i]个i
for(int j=1;j<=a[i];j++)
printf("%d ",i+l);//输出,这里注意左边界的加减
return 0;
}
输入: 5
-5 7
0 -3 2 7 -5
输出:-5 -3 0 2 7
快速排序(QuickSort)
事实上,c++的
快速排序被绝大多数人所使用,它的时间复杂度和空间复杂度均很优秀,在随即情况下排序速度表现最为优良,当然代码和原理也略为复杂。
如果你使用C++语言,那么排序算法在头文件algorithm被引入后就是很简单的一句话搞定:
sort(start,end,cmp)//start:数组起始 end:数组结束 cmp:排序类型,可省略
原理:
每一趟排序,实现找出小于某个数(基准数)的所有内容,放到这个数左边;并将所有大于基准数的内容放到右边。再对左右内容重复用这种方法排序,重复若干次后完成排序。
对于一串无序数组(例:5 1 3 4 2)
设定两个键i,j。令i=1,j=5;
设置一个基准值key为数组中任意一个数,为了方便,这里通常就选取第一个数。key=5
然后j向左找j–直到发现比key小的数,i向右找i++直到发现比key大的值,然后交换i,j
#include <bits/stdc++.h>
using namespace std;
const int M=10005;//随便设置一个大数
int a[M];
//选择用迭代的方法实现
int qs(int x,int y){
int i=x,j=y,t;//i,j用于维护
int k=a[x];//基准值
if(i>=j) return 0;//递归边界
while(i<j){ //注意要保证i<j
while((i<j)&&a[j]>=k)//没找到,继续移动
j--;
swap(a[i],a[j]);
while((i<j)&&a[i]<k)
i++;
swap(a[i],a[j]);
}
qs(x,i-1);//对左半边进行递归
qs(i+1,y);//对右半边进行递归
return 0;
}
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
qs(1,n);//快排
for(int i=1;i<=n;i++) printf("%d ",a[i]);//正序输出为1……n,倒序输出只要反一下即可
return 0;
}
输入: 5
5 2 1 3 4
输出: 1 2 3 4 5