1.冒泡排序
冒泡排序的基本思想是:一个有n个数的数组a[n],从第一个开始,依次比较相邻的两个数是否位逆序对(大的在前,小的在后),则交换这两个数。经过一轮的比较之后,数组中最大的数会被拍到最后面,这样n个数的排序规模就转换为了n-1个数的排序规模。
实现代码如下:
for(int i=n-1;i>=1;i--) //进行n-1次冒泡
for(int j=0;j<i;j++) //进行i次比较
if(a[j]>a[j+1]) swap(a[j],a[j+1]); //相邻两个数比较若为逆序对则进行交换
//swap交换函数,使a[j]和a[j+1]交换数值
//在iostream头文件中
冒泡排序的时间复杂度是o(n^2),需要的时间较长。
2.桶排序
桶排序的思想是:若待排序的值在一个较小的有限范围内时,可设计有限个有序桶,将待排序的值装入桶中,桶号就是待排序的值,顺序输出各桶的值,将得到有序的序列。
实现代码如下:
#include <iostream>
using namespace std;
int main()
{
int a[101]={0},n;
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x; a[x]++;
}
for(int i=0;i<=100;i++)
while(a[i]){
cout<<i<<" ";
a[i]--;
}
}
桶排序这种方法并不是很常用,但是这种思想需要掌握。它的时间复杂度是o(n)。
3.快速排序
快速排序是对冒泡排序的一种改进,它的基本思想是:通过一趟排序将待排序列分割成独立的两部分,其中一部分记录的关键字均比另一部分小,则可分别对这两部分序列继续进行排序,以达到整个序列有序。
具体实现如下:
void quick_sort(int a[],int l,int r) //待排序的序列的左右端点l,r
{
int i,j,mid;
i=l,j=r;
mid=a[(l+r)/2];
do{
while(a[i]<mid) i++; //寻找左半边中比中间数大的数
while(a[j]>mid) j--; //寻找右半边中比中间数小的数
if(j>=i)
{
swap(a[i],a[j]); //若找到一组与排序目标不一致的数对,
//则交换它们
i++; j--;
}
}while(j>=i);
if(l<j) quick_sort(a,l,j);
if(i<r) quick_sort(a,i,r);
}
快排的时间复杂度是o(nlogn),就平均速度而言,是目前最好的一种内部排序方法。
4.归并排序
归并排序的基本思想是:先将一个序列分割成一些较小的有序子序列,再将这些有序子序列拼接成一个完全有序的完整序列。其两大步骤即为分解和合并。
具体代码如下:
int tmp[1e5];
merge_sort(int a[],int l,int r)
{
if(l>=r) return;
int mid=(l+r)/2;
merge_sort(a,l,mid);
merge_sort(a,mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r)
{
if(a[i]<a[j]) tmp[k++]=a[i++];
else tmp[k++]=a[j++];
}
while(i<=mid) tmp[k++]=a[i++];
while(j<=r) tmp[k++]=a[j++];
for(i=l,j=0;i<=r;i++,j++)
a[i]=tmp[j];
}
归并排序的时间复杂度也是o(nlogn),但归并排序需要的辅助空间较多。
5.sort函数
sort函数是一个排序函数,可将一个数组从小到大进行排序,位于algorithm头文件中。
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,a[1005]={0};
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n); //如果a的下标从1开始则为sort(a+1,a+1+n);
for(int i=0;i<n;i++)
cout<<a[i]<<' ';
}
这样可以将数组从小到大进行排序,如果想要从大到小排序则可以加上函数reverse,作用是将数组进行反转。写法与sort相同,也在algorithm头文件中。
sort(a,a+n); //将数组a进行排序
reverse(a,a+n); //反转数组a
或者给sort加一个参数:
sort(a,a+n,greater<int>());