冒泡排序:如果要对n个数进行冒泡排序的话,那么肯定要进行n-1趟比较,在第一趟较中进行n-1次两两比较,在j趟比较中要进行n-j次两两比较。趟数决定了两两比较的次数。
#include<stdio.h>
main()
{
int i,j,t,a[11];
printf("请输入10个数:\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]);
for(i=1;i<10;i++)
for(j=1;j<11-i;j++)
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
printf("排序后的顺序是:\n");
for(i=1;i<=10;i++)
printf("%5d",a[i]);
printf("\n");
}
代码编译执行的实例:
归并排序:
是将两个或者多个有序记录序列合并成一个有序序列。归并方法有很多种。一次对两个有序记录序列进行归并,称为二路归并排序,也有三路归并排序及多路归并排序。简介一下二路归并的基本方法:
(1)将n个记录看成是n个长度的为1的有序子表。
(2)将两两相邻的有序子表进行归并。
(3)重复(2)步骤,直到归并成一个长度为n的有序表。
#include<stdio.h>
void merge(int r[],int s[],int x1,int x2,int x3)
{
int i,j,k;
i=x1;
j=x2+1;
k=x1;
while((i<=x2)&&(j<=x3))
if(r[i]<=r[j])
{
s[k]=r[i];
i++;
k++;
}
else
{
s[k]=r[j];
j++;
k++;
}
while(i<=x2)
s[k++]=r[i++];
while(j<=x3)
s[k++]=r[j++];
}
void merge_sort(int r[],int s[],int m,int n)
{
int p;
int t[20];
if(m==n)
s[m]=r[m];
else
{
p=(m+n)/2;
merge_sort(r,t,m,p);
merge_sort(r,t,p+1,n);
merge(t,s,m,p,n);
}
}
void main()
{
int a[11];
int i;
printf("请输入十个数:\n");
for(i=1;i<=10;i++)
scanf("%d",&a[i]);
merge_sort(a,a,1,10);
printf("排序后的顺序是:\n");
for(i=1;i<=10;i++)
printf("%5d",a[i]);
printf("\n");
}
代码编译执行结果:
n进制转为十进制的代码实现思路:用字符型数组存放一个n进制数,在对数组中的每个元素进行判断,如果是0~9的数字,则这行 t=a[i]-'0';如果是字母的话,则执行 t=a[i]-'A'+10
如果都不符合的话,结束程序结束。
/*
n进制数转为二进制数*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
long t1;
int i,n,t,t3;
char a[100];
printf("请输入数字:\n");
gets(a);
strupr(a);
t3=strlen(a);
t1=0;
printf("请输入进制n(2或8或16):\n");
scanf("%d",&n);
for(i=0;i<t3;i++)
{
if(a[i]-'0'>=n&&a[i]<'A'||a[i]-'A'+10>=n)
{ printf("输入有误!!");
exit(0);
}
if(a[i]>='0'&&a[i]<='9')
t=a[i]-'0';
else if(n>=11&&(a[i]>='A'&&a[i]<='A'+n-10))
t=a[i]-'A'+10;
t1=t1*n+t;
}
printf("十进制数形式是%d\n",t1);
}
程序代码编译执行的结果: