数据排序

此例中使用两重循环来实现排序。但是值得注意的是以上程序执行时元素的交换并不都是必须的。
#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 <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]);
}


经过改进后的程序每选一个元素只交换一次,提高了程序执行效率。
***********************************************************
下面是另外一种排序方法:
/*用冒泡法将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==0break;
    }

}


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();
}
posted @ 2007-01-16 09:15  齐心  Views(614)  Comments(0Edit  收藏  举报