c语言简单排序算法
在c语言学习中,排序算法很重要,在学完数组后,就必须学会排序算法,不论是刷题还是做一些东西,都必须掌握,下面介绍几种简单的排序算法。
桶排序–最简单最快的排序
桶排序,从名字上都觉得蛮有意思的,它实现的方法很简单,就是弄一大堆桶,每个桶上按顺序贴上标签,比如我要10个数排序,这10个数的范围是0到100,于是我就创建一个啊a[101]的数组数组,也就是100个桶,下标就是代表该桶的值。然后排序的时候,出现一个数,就让该数值的桶里面放个石头,也就是该数组元素的值+1,然后排序的时候,就可以从第一个桶开始数,看里面有石头没,有几个,如果有就输出该桶上的值,没有就看下一个,这样就从小到大排序了哈,如果想从大到小排序,就从最后一个桶开始往前数。
#include <stdio.h>
int main(void)
{
int book[1000],i,j,k,t,n;
//输出数字的范围是0到999,也就是999个桶
for(i = 0;i < 1000;i++)
{
book[i] = 0; //清空数组,也就是所有桶里一开始没有石头
}
scanf("%d",&n); //输入你要排序多少个数
for(i = 0;i < n;i++) //循环读入n个数
{
scanf("%d",&t);
book[t]++; //桶里放石头哈
}
for(i=1000;i>=0;i--) //从大到小排序
{
for(j=0;j<book[i];j++)
{
printf("%d ",i); //有几个石头就输出几次
}
`
}
return 0;
}
桶排序速度快,简单,但是它是用空间来换取时间,占的内存大,可以去重复的数字特别方便,这个只是简单的桶排,只能处理不是特别大的数字。
快速排序
在快速排序算法中,使用了分治策略。首先把序列分成两个子序列,递归地对子序列进行排序,直到整个序列排序结束。
步骤如下:
在序列中选择一个关键元素做为轴;
对序列进行重新排序,将比轴小的元素移到轴的前边,比轴大的元素移动到轴的后面。在进行划分之后,轴便在它最终的位置上;
递归地对两个子序列进行重新排序:含有较小元素的子序列和含有较大元素的子序列。
下面的动画展示了快速
排序算法的工作原理。
#include <stdio.h>
int a[1000];
void sort(int a[],int left,int right)
{
int i=left;
int j=right;
int temp=a[left];
if(left<right)
{
while(i < j)
{
while(a[j]>temp&&i<j){
j--;
}
a[i]=a[j];
while(a[i]<temp&&i<j){
i++;
}
a[j]=a[i];
}
a[i]=temp;
sort(a,left,i-1);
sort(a,j+1,right);
}
else
{
return;
}
}
int main(void)
{
int n,i;
scanf("%d",&n);
for(i = 0;i < n;i++)
{
scanf("%d",&a[i]);
}
sort(a,0,n-1);
for(i = 0;i < n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
这个我写的快排函数感觉有点和书上写的不太一样,但是能用,尴尬。
快排里面用到了,分治的想法,递归处理,速度较快,但是不稳定。
冒泡排序
自己对冒泡排序这个名字觉得蛮有意思的,就像鱼鱼吐泡泡一样,小的数不断往上跑,其实这个算法也蛮简单的,就是两重循环,大的循环是要走的趟数,趟数是n-1,n为要排序的数的个数,小循环里面是每循环一次,就把改数组里最大的或最小的数放到最后面,下一次小循环,就把剩下的数,最大的或最小的放在剩下的数的最后面,这样就完成了从小到大排序或从大到小排序。
#include <stdio.h>
int main(void)
{
int a[100],i,j,t,n;
scanf("%d",&n); //输入要排序的数的个数
for( i =0;i< n;i++)
{
scanf("%d",&a[i]);
}
//冒泡排序的核心部分
for(i =0;i<n-1;i++)
{
for(j=0;j<n-i;j++)
{
if(a[j]<a[j+1])
{
t = a[j];
a[j] = a[j+1];
a[j+1] = t;
}
}
}
for(i =0 ;i < n;i++)
{
printf("%d",a[i]
);
}
return 0;
}
冒泡排序有两重循环,时间复杂度高
总结
以上就3种简单的排序,还有许多排序方法,这里的排序算法都按我自己的理解写解释了下,哇咔咔。