C语言中的几种排序算法
在编程练习时,我们经常会遇到一些将一串乱序的数字排列成有序的数列(递增,递减)的问题,以此起到解决问题的效果。目前我使用的比较熟练的有三种排序算法,冒泡排序法,快速排序法,另外一个是C++中的sort算法。
- 冒泡排序法
冒泡排序法是比较好理解,硬排的一种算法,缺点是当数列的元素过大时,排序的效率会比较低,时间复杂度会比较高。最好的情况时,复杂度为O(n),最差的为O(n*n),做题时经常会出现超时的现象。
冒泡排序法使用两层for循环嵌套,第一层循环确定以那个元素开始比较,第二层循环在数组内比较大小。
*代码如下
#include<stdio.h>
int a[100];//数组定义在main函数外,防止元素个数过多爆栈,且数组内元素自动清零
int main()
{
int n,i,j,tmp;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)//第i个元素与本行所有元素比较
{
if(a[i]>a[j])//递增
{
tmp=a[i];
a[i]=a[j];
a[j]=tmp;//交换值,大的数顺序提前
}
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
- 快速排序法(quicksort)
快速排序法运用了分治策略和递归算法,主要先定义一个基准点(一般选在数组中间),在基准点的两端开始排序,左边遇到比基准点大的,右边遇到比基准点小的,交换数值。
*代码如下
#include<stdio.h>
int a[100];
void quicksort(int a[],int left,int right)
{
int i=left,j=right,mid=a[(i+j)/2],tmp;
while(i<j)
{
while(a[i]<mid)i++;//找到比基准点大的退出循环
while(a[j]>mid)j--;//找到比基准点小的退出循环
if(i<=j)
{
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
i++;//左边继续往后遍历
j--;//右边继续往前遍历
}
}
//i>j指遍历错开基准点,此时分为左右两部分,继续递归执行quicksort
if(left<j)quicksort(a,left,j);
if(i<right)quicksort(a,i,right);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
quicksort(a,0,n-1);
for(int i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
- sort(C++)
sort是C++中的一个函数,使用时要包含头文件#include,
sort函数的模板有三个参数:
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
(1)第一个参数first:是要排序的数组的起始地址。
(2)第二个参数last:是结束的地址(最后一个数据的后一个数据的地址)sort(数组名,数组名+数组元素个数,排序方法)
(3)第三个参数comp是排序的方法:可以是从升序也可是降序。如果第三个参数不写,则默认的排序方法是从小到大排序。
元素自身包含了比较关系,如int,double等基础类型,可以直接进行比较greater() 递减, less() 递增(省略)
*代码如下
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp1(int x,int y)
{
return x>y;//x>y时,bool型返回true,x置于y前
}
bool cmp2(int x,int y)
{
return x<y;//x>y时,bool型返回true,x置于y前
}
int a[105];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n,greater<int>());//从大到小
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
sort(a,a+n,cmp1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
sort(a,a+n,less<int>());//从小到大
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
sort(a,a+n,cmp2);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
后续会继续补充