C语言--排序
一、桶排序
1.简介
桶排序算法思想是由E.J.Issac和R.C.Singleton提出的,1956年开始使用。示例是简化版,不是真正意义上的桶排序,示例算法具有以下特点。
优点:时间复杂程度小,速度快。
缺点:
①相同的数字,无法实现数字与其他事物的一一对应关系。
②当排序的数字,它的范围较大时,会造成很大的空间浪费。(需要申请非常大的一维数组)
2.用法说明
示例是简化版本的桶排序,是利用一维数组来进行排序的一种排序方式。其中一维数组元素number[i]的值为数字 i 的个数。
3.代码示例
#include<stdio.h>
int main ()
{
printf("----功能:为范围在0-10之间的n个数字降序排序(包含0和10)------\n\n\n") ;
int number[11]={0};//定义一维数组并初始化。此时输入数字的范围为0~10
int i,j,t,n;
printf("请输入需要排列的数字总数n:") ;
scanf("%d",&n);
getchar(); //吞掉回车
printf("请依次输入%d个范围内的数字:",n) ;
for(i=1;i<=n;i++)
{
scanf("%d",&t);
number[t]++; //数字t的个数
}
printf("\n\n这%d个数字按降序输出结果为:",n) ;
for(i=10;i>=0;i--)//升序用“for(i=0;i<=10;i++)”代替
for(j=1;j<=number[i];j++)
{
printf("%d ",i);
}
getchar();//或者用system("pause")也可以
return 0;
}
二、冒泡排序
1.简介
缺点:时间复杂度高,速度慢。
优点:可以比较较大的数字而不浪费空间。
2.用法说明
算法的核心是双重嵌套循环进行比较。用第三个变量暂时储存正在比较中的数据。
3.代码示例
#include<stdio.h>
int main()
{
int a[100];//数组用于储存排序的数字
int i,j,t,n;
printf("\n输入需要排序的数字的总数:");
scanf("%d",&n);
getchar(); //吞掉回车
printf("\n依次输入%d个数字:",n) ;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n-1;i++)//一共有n-1 躺比较
for(j=1;j<=n-i;j++)//第i趟比较:第i个数依次与其后的n-i个数进行比较
{
if(a[j]<a[j+1])//升序: “if(a[j]>a[j+1])”
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
printf("\n降序输出的结果为:");
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
getchar();getchar();
return 0;
}
三、快速排序
1.简介
优点:既不浪费空间也不浪费时间。
缺点:非要说个缺点的话,就是得动用一下小脑袋瓜,有函数和递归的运用。并且不是非常稳定。
2.用法说明
算法的重点在于递归思想与二分思想。
3.代码示例
#include<stdio.h>
int a[100],n;//全局变量,由于函数中也用到了故定义全局的变量
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;//防止右边大于左边的输入错误
temp=a[left];//temp引进来为了下面基准数的归位
i=left;
j=right;
while(i!=j)
{//以左边的数为基准,先右后左的顺序不能调换
while(a[j]<=temp && j>i)//升序“while(a[j]>=temp && j>i)”
j--;
while(a[i]>=temp && i<j)//升序“while(a[i]<=temp && i<j)”
i++;
//调换两个数的位置
if(i<j)
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
}
//令基准数归位的交换
a[left]=a[i];
a[i]=temp;
//递归,分别按上述方法使基准数左右两部分进行运算
quicksort(left,i-1);
quicksort(i+1,right);
return;
}
int main()
{
int i,j;
printf("\n请输入要排列的数的总数:");
scanf("%d",&n);
printf("\n请输入%d个数字:",n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n);
printf("\n以上数字降序排列结果为:");
for(i=1;i<=n;i++)
printf("%d ",a[i]);
return 0;
}
四、直接插入排序
1.简介
插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。
2.用法说明
从左二开始比较,将其值存在临时变量里面,其左邻居较小时,左邻居占据它的位置,其左二邻居较小时,左二邻居占据左邻居的位置…直到在左边找到它的正确位置。然后开始下一位(左三)的插入运算。
3.代码示例
#include<stdio.h>
int a[100],n;//全局变量,由于函数中也用到了故定义全局的变量
void InsertSort(int a[], int n)
{
int temp = 0;
int i,j;
for (i = 2; i <= n; i++)
{
if (a[i] > a[i-1])//第i位(插入数)先和左邻居进行比较,如果i小,则前i位均降序排列好,进行下一位比较
{
j=i-1; //表示插入数的左邻居的排队号
temp = a[i];//暂时存储插入数的值
while (j>=1 && temp>a[j])//插入数与前i-1位依次比较 ,当其值较大时进行以下运算
{
a[j+1] = a[j]; //左邻居同时占据了插入数的位置
j--;//左邻居的左邻居号码
}
a[j+1] = temp;//循环结束,将插入数插到正确的位置
}
}
}
int main()
{
printf("\n需要排列的数字总数:");
scanf("%d",&n);
int i;
printf("\n请输入%d个数字:",n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
InsertSort(a, n);
printf("\n降序输出以上数字为:");
for (i = 1; i <= n; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}