数据排序
此例中使用两重循环来实现排序。但是值得注意的是以上程序执行时元素的交换并不都是必须的。
经过改进后的程序每选一个元素只交换一次,提高了程序执行效率。
***********************************************************
下面是另外一种排序方法:
****************************************************
用指针实现选择法排序
#include <stdio.h>
#include <conio.h>
#define N 10
void main()
{
int i,j,t;
int a[N];
clrscr();
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("\n");
for(i=0;i<N;i++) printf("%-6d",a[i]);
}
事实上,只要记住比较时大元素的位置,即序号,在内循环结束后做一次交换即可,从而提高程序执行的效率。#include <conio.h>
#define N 10
void main()
{
int i,j,t;
int a[N];
clrscr();
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
printf("\n");
for(i=0;i<N;i++) printf("%-6d",a[i]);
}
#include <stdio.h>
#include <conio.h>
#define N 10
void main()
{
int i,j,t,k;
int a[N];
clrscr();
for(i=0;i<N;i++) scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
{k=i;
for(j=i+1;j<N;j++)
if(a[k]<a[j]) k=j;
if(k!=i)
{
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
printf("\n");
for(i=0;i<N;i++) printf("%6d",a[i]);
}
#include <conio.h>
#define N 10
void main()
{
int i,j,t,k;
int a[N];
clrscr();
for(i=0;i<N;i++) scanf("%d",&a[i]);
for(i=0;i<N-1;i++)
{k=i;
for(j=i+1;j<N;j++)
if(a[k]<a[j]) k=j;
if(k!=i)
{
t=a[i];
a[i]=a[k];
a[k]=t;
}
}
printf("\n");
for(i=0;i<N;i++) printf("%6d",a[i]);
}
经过改进后的程序每选一个元素只交换一次,提高了程序执行效率。
***********************************************************
下面是另外一种排序方法:
/*用冒泡法将8个数按由小到大排序*/
/*冒泡法的基本思想是:相邻两数比较,若前面较大,则两数交换位置,直到最后一个元素被处理,
最大的元素就沉到最下面,即在最后一个元素位置。*/
#include <stdio.h>
#include <conio.h>
#define N 80
void sort(int b[],int k);
void print(int b[],int k);
void main()
{
int a[N];
int i,m;
clrscr();
printf("Input m(<80):");
scanf("%d",&m);
printf("Input numbers:");
for(i=0;i<m;i++)
scanf("%d",&a[i]);
sort(a,m);
print(a,m);
}
void sort(int b[],int k)
{
int i,j,t,flag;
for(j=0;j<k-1;j++)
{
flag=0;
for(i=0;i<k-j-1;i++)
if(b[i]>b[i+1])
{
t=b[i];
b[i]=b[i+1];
b[i+1]=t;
flag=1;
}
if(flag==0) break;
}
}
void print(int b[],int k)
{
int i;
for(i=0;i<k;i++)
{
if(i%4==0) putchar('\n');
printf("%-6d",b[i]);
}
}
/*冒泡法的基本思想是:相邻两数比较,若前面较大,则两数交换位置,直到最后一个元素被处理,
最大的元素就沉到最下面,即在最后一个元素位置。*/
#include <stdio.h>
#include <conio.h>
#define N 80
void sort(int b[],int k);
void print(int b[],int k);
void main()
{
int a[N];
int i,m;
clrscr();
printf("Input m(<80):");
scanf("%d",&m);
printf("Input numbers:");
for(i=0;i<m;i++)
scanf("%d",&a[i]);
sort(a,m);
print(a,m);
}
void sort(int b[],int k)
{
int i,j,t,flag;
for(j=0;j<k-1;j++)
{
flag=0;
for(i=0;i<k-j-1;i++)
if(b[i]>b[i+1])
{
t=b[i];
b[i]=b[i+1];
b[i+1]=t;
flag=1;
}
if(flag==0) break;
}
}
void print(int b[],int k)
{
int i;
for(i=0;i<k;i++)
{
if(i%4==0) putchar('\n');
printf("%-6d",b[i]);
}
}
****************************************************
用指针实现选择法排序
#include "stdio.h"
#include "conio.h"
#include "string.h"
void main()
{
int data[8],i,*p1,*p2,temp;
p1=data; /*p1指向数组data的第一个元素*/
printf("Input 8 numbers:");
for(i=0;i<8;i++)
{
scanf("%d",p1);
p1++;
}
for(p1=data;p1<data+8-1;p1++) /*排序从p1指向第一个元素开始,到第n-1个元素结束*/
for(p2=p1+1;p2<data+8;p2++)
if(*p1<*p2) /*选择比较从p1+1开始,到最后一个元素结束*/
{temp=*p1;*p1=*p2;*p2=temp;}
for(i=0,p1=data;i<8;i++,p1++)
printf("%6d",*p1);
getch();
}
#include "conio.h"
#include "string.h"
void main()
{
int data[8],i,*p1,*p2,temp;
p1=data; /*p1指向数组data的第一个元素*/
printf("Input 8 numbers:");
for(i=0;i<8;i++)
{
scanf("%d",p1);
p1++;
}
for(p1=data;p1<data+8-1;p1++) /*排序从p1指向第一个元素开始,到第n-1个元素结束*/
for(p2=p1+1;p2<data+8;p2++)
if(*p1<*p2) /*选择比较从p1+1开始,到最后一个元素结束*/
{temp=*p1;*p1=*p2;*p2=temp;}
for(i=0,p1=data;i<8;i++,p1++)
printf("%6d",*p1);
getch();
}