好友
阅读权限10
听众
最后登录1970-1-1
|
#include<stdio.h>
//#define n 10
//#define m 6
//#define n 4
int main()
{
/***
冒泡排序(起泡排序)
假设要对含有n个数的序列进行升序排列,冒泡排序算法步骤是:
①从存放序列的数组中的第一个元素开始到最后一个元素,依次对相邻两数进行比较,若前者大后者小,则交换两数的位置;
②第①趟结束后,最大数就存放到数组的最后一个元素里了,然后从第一个元素开始到倒数第二个元素,依次对相邻两数进行比较,若前者大后者小,则交换两数的位置;
③重复步骤①n-1趟,每趟比前一趟少比较一次,即可完成所求。
***/
/*
//任意读入10个整数,将其用冒泡法按升序排列后输出。
int arr[10];
int i,j,n;
printf("请输入10个数\n");
for(i=0;i<10;i++)
{
scanf("%d",&arr[i]);
}
printf("\n");
for(j=0;j<9;j++)
{
for(i=0;i<9-j;i++)
{
if(arr[i]>arr[i+1])
{
n=arr[i];
arr[i]=arr[i+1];
arr[i+1]=n;
}
}
}
for(i=0;i<10;i++)
{
printf("%d->",arr[i]);
}
*/
/***
选择法排序
选择法排序是相对好理解的排序算法。假设要对含有n个数的序列进行升序排列,算法步骤是:
①从数组存放的n个数中找出最小数的下标(算法见下面的“求最值”),然后将最小数与第1个数交换位置;
②除第1个数以外,再从其余n-1个数中找出最小数(即n个数中的次小数)的下标,将此数与第2个数交换位置;
③重复步骤①n-1趟,即可完成所求。
***/
/*
//任意读入10个整数,将其用选择法按升序排列后输出
int a[10];
int i,j,k,t;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<10;i++) //处理n-1趟
{
k = i; //总是假设此趟处理的第一个(即全部数的第i个)数最小,k记录其下标
for(j=i+1;j<10;j++)
if(a[j] < a[k])
k = j;
if (k != i)
{
t = a[i];
a[i] = a[k];
a[k] = t;
}
}
printf("\n");
for(i=0;i<10;i++)
printf("%d ",a[i]);
*/
/*
//将任意读入的整数x插入一升序数列后,数列仍按升序排列
int a[10]={-1,3,6,9,13,22,27,32,49},x,j,k; //注意留一个空间给待插数
scanf("%d",&x);
if(x>a[8])
a[9]=x; //比最后一个数还大就往最后一个元素中存放
else //查找待插位置
{
j=0;
while( j<=8 && x>a[j])
j++;
//从最后一个数开始直到待插位置上的数依次后移一位
for(k=8; k>=j; k--)
a[k+1]=a[k];
a[j]=x; //插入待插数
}
for(j=0;j<=9;j++) printf("%d \n",a[j]);
*/
//-----> 有逻辑错误
/*
//在上面宏定义#definne n 10
//任意读入10个整数,将其用插入法按降序排列后输出。
int a[n],i,j,k,x;
scanf("%d",&a[0]); //读入第一个数,直接存到a[0]中
for(j=1;j<n;j++) //将第2至第10个数一一有序插入到数组a中
{
scanf("%d",&a[j]);
if(x<a[j-1])
a[j]=x; //比原数列最后一个数还小就往最后一个元素之后存放新读的数
else //以下查找待插位置
{
i=0;
while(x<a[j-1] && i<=j-1)
i++;
for(k=j-1;k>=i;k--) //以下for循环从原最后一个数开始直到待插位置上的数依次后移一位
a[k+1]=a[k];
a[j]=x; //插入待插数
}
}
for(i=0;i<n;i++)
printf("%d\n",a);
*/
/*
//-----> 有逻辑错误
//宏定义#define m 6 #define n 4
//有一个含有6个数据的升序序列和一个含有4个数据的升序序列,将二者合并成一个含有10个数据的升序序列
int a[m]={-3,6,19,26,68,100} ,b[n]={8,10,12,22};
int i,j,k,c[m+n];
i=j=k=0;
while(i<m && j<n) //将a、b数组中的较小数依次存放到c数组中
{
if(a[0] < b[j])
{
c[k]=a[0];
i++;
}
else
{
c[k]=b[j];
j++;
}
k++;
}
while(i>=m && j<n) //若a中数据全部存放完毕,将b中余下的数全部存放到c中
{
c[k]=b[j];
k++;
j++;
}
while(j>=n && i<m) //若b中数据全部存放完毕,将a中余下的数全部存放到c中
{
c[k]=a[i];
k++;
i++;
}
for(i=0;i<m+n;i++)
printf("%d ",c);
}
*/
/*
//任意读入10个数存放到数组a中,然后读入待查找数值,存放到x中,判断a中有无与x等值的数
int a[10],i,x;
for(i=0;i<10;i++)
scanf("%d",&a);
printf("------------\n"); //以下读入待查找数值
scanf("%d",&x);
for(i=0;i<10;i++)
{
if(a==x)
printf("Found!\n");
break;
}
if(a!=x)
printf("Not found!\n");
}
*/
/***
折半查找(即二分法)
顺序查找的效率较低,当数据很多时,用二分法查找可以提高效率。使用二分法查找的前提是数列必须有序。
二分法查找的思路是:要查找的关键值同数组的中间一个元素比较,若相同则查找成功,结束;
否则判别关键值落在数组的哪半部分,就在这半部分中按上述方法继续比较,直到找到或数组中没有这样的元素值为止。
***/
/*
//任意读入一个整数x,在升序数组a中查找是否有与x等值的元素
int a[10]={2,4,7,9,12,25,36,50,77,90};
int x,high,low,mid; //x为关键值
scanf("%d",&x);
high=9;
low=0;
mid=(high+low)/2;
while(a[mid]!=x&&low<high)
{
if(x<a[mid])
high=mid-1;
else low=mid+1;
mid=(high+low)/2;
}
if(x==a[mid])
printf("Found %d,%d\n",x,mid+1);
else printf("Not found\n");
}
*/ |
|