这是用C语言写好的5种最常用的排序算法:
1:冒泡排序 2:交换排序 3:选择排序
4:插入排序 5:快速排序
这5种算法都经过VC6.0测试,可以正确运行
其中带有一个洗牌函数,主要是为了打乱数组数据,方便测试排序函数。
这5种算法都参考了其它书籍,在效率上很不错。
#include<stdio.h> //输入输出函数头文件
# include<stdlib.h> //随机函数头文件
# include<time.h> //时间函数头文件
//Array数组名称,n数组长度
void Wash(int Array[],int n); //洗乱数组
void Bubble(int Array[],int n); //冒泡排序
void Exchange(int Array[],int n); //交换排序
void Choice(int Array[],int n); //选择排序
void Insert(int Array[],int n); //插入排序
int Separate(int Array[],int x,int n);//用于返回快排时,首次查到的分隔位置
void Fast(int Array[],int x,int n); //快速排序
int main() //x是起始位置,方便递归。
{
c语言的冒泡排序算法 int i;
int a[10]={0,1,2,3,4,5,6,7,8,9};
Wash(a,10); //洗乱数组
for(i=0;i<10;i++)
printf("%d ",a[i]);
putchar('\n');
//Bubble(a,10); //冒泡排序
//Exchange(a,10); //交换排序
//Choice(a,10); //选择排序
//Insert(a,10); //插入排序
Fast(a,0,9); //快速排序
for(i=0;i<10;i++)
printf("%d ",a[i]);
putchar('\n');
return 0;
}
void Wash(int Array[],int n) //洗乱数组
{ //这是一个比较常用的洗牌算法,将数组中的每一个元素和一个随机数下标进行交换。
int i=0,k=0,m=0;
srand((unsigned)time(NULL)); /*以时间为随机种子*/
for(i=0;i<n;i++)
{
m=rand()%n; //m为随机0-n之间的随机数
k=Array[i];
Array[i]=Array[m];
Array[m]=k;
}
}
void Bubble(int Array[],int n) //冒泡排序
{ //冒泡的思想是前一个元素和后一个元素进行比较,当前一个大于或小于时就交换。
int i,k,m;
m=n-1; //最后一次交换元素位置,这个主要是在最后如果出现
while(m!=0) //连继不需要排序的元素时就可以过滤掉不需要排序的元素
{
k=m; //k元素后的元素是已排序了的元素。
m=0; //如果这里m不至0,将会导致算法不稳定,可能出死循环
for(i=0;i<k;i++)
{
if(Array[i]>Array[i+1])
{ //每一躺比较将最大值排到最后
int j=Array[i];
Array[i]=Array[i+1];
Array[i+1]=j;
m=i;
}
}
}
}
void Exchange(int Array[],int n) //交换排序
{ //交换排序的思想是每一个待排元素和后面的所有元素进行比较
int i,j,m; //如果出现大于或小于就交换两元素数据
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(Array[i]>Array[j])
{
m=Array[i];
Array[i]=Array[j];
Array[j]=m;
}
}
void Choice(int Array[],int n) //选择排序
{ //选择排序的思想是每躺比较出最大或最小值
int i,j,m,u; //然后将结果和待排元素的第一个位置的元素进行交换
for(i=0;i<n-1;i++)
{
m=i; //m记录待排元素每一个元素的位置
for(j=i+1;j<n;j++)
if(Array[m]>Array[j])
m=j; //如果到最大或最小值就将元素位置保存到m
if(m!=i) //如果m元素发生变化,就说明出现新在最值或最小值
{ //然后将结果和待排元素的第一个元素进行交换
u=Array[i];
Array[i]=Array[m];
Array[m]=u;
}
}
}
void Insert(int Array[],int n) //插入排序
{ //插入排序的思想是将每个元素插入到一个待排列表中,每插入一个数据就和
int i,j,m; //前面的数据进行比较,保证在插入新数据前这些数据是有序的。
for(i=1;i<n;i++)
for(j=0;j<i;j++)
if(Array[i]<Array[j])
{
m=Array[i];
Array[i]=Array[j];
Array[j]=m;
}
}
void Fast(int Array[],int x,int n) //快速排序
{ //快速排序思想是随便抽取一个元素,将抽取的元素放置到最终的位置
int pos; //然后按照此元素的位置将待排列表分为两个部分,按照同样的方法
if(x<n) //再细分,直到无法分隔为至。
{
pos=Separate(Array,x,n); //将x元素放到最张位置,并将该位置返回给pos
Fast(Array,x,pos-1); //然后再利用递归将左边按同样方法细分
Fast(Array,pos+1,n); //然后再利用递归将右边按同样方法细分
}
}
int Separate(int Array[],int x,int n) //用于返回快排时,首次查到的分隔位置
{
int vol=Array[x]; //vol存储要进行分隔的元素数据
while(x<n)
{
while(x<n && Array[n]>=vol)
--n; //当n位置元素大于或等于vol时就移动
Array[x]=Array[n]; //当n位置元素小于vol时就将n位置数据放至x位置
while(x<n && Array[x]<=vol)
++x; //当x位置元素小于或等于vol时就移动
Array[n]=Array[x]; //当x位置元素大于vol时就将x位置数据放至n位置
}
Array[x]=vol;//当x和n位置重合时就表示到最终分隔位置,并将数据放至该位置
return x; //并返回最终位置
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论