上梁山-排序题

A3.按照学号从小到大排序

在这里插入图片描述
修改前

#include  <stdio.h>
#define    N    5
typedef struct student {
  long  sno;
  char  name[10];
  float  score[3];
} STU;
void fun(char  *filename)
{ FILE  *fp;      int  i, j;
  STU  s[N], t;
/**********found**********/
  fp = fopen(filename, __1__);
  fread(s, sizeof(STU), N, fp);
  fclose(fp);
  for (i=0; i<N-1; i++)
    for (j=i+1; j<N; j++)
/**********found**********/
      if (s[i].sno __2__ s[j].sno)
      {  t = s[i];  s[i] = s[j];  s[j] = t;  }
  fp = fopen(filename, "wb");
/**********found**********/
  __3__(s, sizeof(STU), N, fp); 
  fclose(fp);
}
void main()
{ STU  t[N]={ {10005,"ZhangSan", 95, 80, 88}, {10003,"LiSi", 85, 70, 78},
             {10002,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87},
             {10001,"MaChao", 91, 92, 77}}, ss[N];
  int  i,j;      FILE  *fp;
  fp = fopen("student.dat", "wb");
  fwrite(t, sizeof(STU), 5, fp);
  fclose(fp);
  printf("\n\nThe original data :\n\n");
  for (j=0; j<N; j++)
  {  printf("\nNo: %ld  Name: %-8s      Scores:  ",t[j].sno, t[j].name);
     for (i=0; i<3; i++)  printf("%6.2f ", t[j].score[i]);
     printf("\n");
  }
  fun("student.dat");
  printf("\n\nThe data after sorting :\n\n");
  fp = fopen("student.dat", "rb");
  fread(ss, sizeof(STU), 5, fp);
  fclose(fp);
  for (j=0; j<N; j++)
  {  printf("\nNo: %ld  Name: %-8s      Scores:  ",ss[j].sno, ss[j].name);
    for (i=0; i<3; i++)  printf("%6.2f ", ss[j].score[i]);
    printf("\n");
  }
}


修改后

#include  <stdio.h>
#define    N    5
typedef struct student {
  long  sno;
  char  name[10];
  float  score[3];
} STU;
void fun(char  *filename)
{ FILE  *fp;      int  i, j;
  STU  s[N], t;
/**********found**********/
  fp = fopen(filename, "rb");
  fread(s, sizeof(STU), N, fp);
  fclose(fp);
  for (i=0; i<N-1; i++)
    for (j=i+1; j<N; j++)
/**********found**********/
      if (s[i].sno > s[j].sno)
      {  t = s[i];  s[i] = s[j];  s[j] = t;  }
  fp = fopen(filename, "wb");
/**********found**********/
  fwrite(s, sizeof(STU), N, fp); 
  fclose(fp);
}
void main()
{ STU  t[N]={ {10005,"ZhangSan", 95, 80, 88}, {10003,"LiSi", 85, 70, 78},
             {10002,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87},
             {10001,"MaChao", 91, 92, 77}}, ss[N];
  int  i,j;      FILE  *fp;
  fp = fopen("student.dat", "wb");
  fwrite(t, sizeof(STU), 5, fp);
  fclose(fp);
  printf("\n\nThe original data :\n\n");
  for (j=0; j<N; j++)
  {  printf("\nNo: %ld  Name: %-8s      Scores:  ",t[j].sno, t[j].name);
     for (i=0; i<3; i++)  printf("%6.2f ", t[j].score[i]);
     printf("\n");
  }
  fun("student.dat");
  printf("\n\nThe data after sorting :\n\n");
  fp = fopen("student.dat", "rb");
  fread(ss, sizeof(STU), 5, fp);
  fclose(fp);
  for (j=0; j<N; j++)
  {  printf("\nNo: %ld  Name: %-8s      Scores:  ",ss[j].sno, ss[j].name);
    for (i=0; i<3; i++)  printf("%6.2f ", ss[j].score[i]);
    printf("\n");
  }
}

考察知识点:文件读写

A5.字符串按从长到短的顺序排序

在这里插入图片描述
修改前

#include  <stdio.h>
#include  <string.h>
#define   N   5
#define   M   8
void fun(char  (*ss)[M])
{ char  *ps[N],*tp;    int  i,j,k;
  for(i=0; i<N; i++) ps[i]=ss[i];
  for(i=0; i<N-1; i++) {
/**********found**********/
    k=  __1__ ;
    for(j=i+1; j<N; j++)
/**********found**********/
       if(strlen(ps[k]) < strlen(__2__) ) k=j;
/**********found**********/
    tp=ps[i];  ps[i]=ps[k]; ps[k]= __3__ ;
  }
  printf("\nThe string after sorting by length:\n\n");
  for(i=0; i<N; i++)  puts(ps[i]);
}
void main()
{ char  ch[N][M]={"red","green","blue","yellow","black"};
  int  i;
  printf("\nThe original string\n\n");
  for(i=0;i<N;i++)puts(ch[i]);  printf("\n");
  fun(ch);
}


修改后

#include  <stdio.h>
#include  <string.h>
#define   N   5
#define   M   8
void fun(char  (*ss)[M])
{ char  *ps[N],*tp;    int  i,j,k;
  for(i=0; i<N; i++) ps[i]=ss[i];
  for(i=0; i<N-1; i++) {
/**********found**********/
    k=  i ;
    for(j=i+1; j<N; j++)
/**********found**********/
       if(strlen(ps[k]) < strlen(ps[j]) ) k=j;
/**********found**********/
    tp=ps[i];  ps[i]=ps[k]; ps[k]= tp;
  }
  printf("\nThe string after sorting by length:\n\n");
  for(i=0; i<N; i++)  puts(ps[i]);
}
void main()
{ char  ch[N][M]={"red","green","blue","yellow","black"};
  int  i;
  printf("\nThe original string\n\n");
  for(i=0;i<N;i++)puts(ch[i]);  printf("\n");
  fun(ch);
}

(1)外循环每循环一次,k保存当前i值;
(2)内循环比较i+1后面字符串长度;
(3)经典的交换两个变量。

temp = a; a = b; b = temp;

temp = a;由C语言赋值语句可得,把a的值赋给temp
在这里插入图片描述

A25.下标为奇数的字符取出,并按ASCII码大小递增排序(选择排序法)

在这里插入图片描述
修改前

#include    <stdio.h>
void fun(char  *s, char  *p)
{  int  i, j, n, x, t;
   n=0;
   for(i=0; s[i]!='\0'; i++)  n++;
   for(i=1; i<n-2; i=i+2) {
/**********found**********/
      ___1___;
/**********found**********/
      for(j=___2___+2 ; j<n; j=j+2)
        if(s[t]>s[j]) t=j;
      if(t!=i)
      {  x=s[i]; s[i]=s[t]; s[t]=x; }
   }
   for(i=1,j=0; i<n; i=i+2, j++)  p[j]=s[i];
/**********found**********/
   p[j]=___3___;
}
void main()
{  char  s[80]="baawrskjghzlicda", p[50];
   printf("\nThe original string is :  %s\n",s);
   fun(s,p);
   printf("\nThe result is :  %s\n",p);
}

修改后

#include    <stdio.h>
void fun(char  *s, char  *p)
{  int  i, j, n, x, t;
   n=0;
   for(i=0; s[i]!='\0'; i++)  n++;
   for(i=1; i<n-2; i=i+2) {
/**********found**********/
      t = i;
/**********found**********/
      for(j=t+2 ; j<n; j=j+2)
        if(s[t]>s[j]) t=j;
      if(t!=i)
      {  x=s[i]; s[i]=s[t]; s[t]=x; }
   }
   for(i=1,j=0; i<n; i=i+2, j++)  p[j]=s[i];
/**********found**********/
   p[j]='\0';
}
void main()
{  char  s[80]="baawrskjghzlicda", p[50];
   printf("\nThe original string is :  %s\n",s);
   fun(s,p);
   printf("\nThe result is :  %s\n",p);
}

在这里插入图片描述
**难度等级:**★★★☆☆
学点啥
排序题的选择法,也就是遍历,通过比较在第一个位置放置最值;然后第二个位置,遍历余下,放置次最值…
选择排序法是一种不稳定的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。

void swap(int *a,int *b) 
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
void selection_sort(int arr[], int len) 
{
    int i,j;
 
    for (i = 0 ; i < len - 1 ; i++) 
    {
        int min = i;
        for (j = i + 1; j < len; j++)     
            if (arr[j] < arr[min])    
                min = j;    
           swap(&arr[min], &arr[i]);    
    }
}

本题选择排序法放置在1、3、5而已

#include    <stdio.h>
void fun(char  *s, char  *p)
{  int  i, j, n, x, t;
   n=0;

   //for(i=0; s[i]!='\0'; i++)  n++;   /*求得字符串长度*/
   i = 0;  while (s[i++])  n++;   /*求得字符串长度 等效方式*/

   for(i=1; i<n-2; i=i+2) {
/**********found**********/
      t = i;//循环变量幅初值
/**********found**********/
	  /*第i个位置放置最值
	  如初始在第一个位置放置最小值
	  */
      for(j=t+2 ; j<n; j=j+2)
        if(s[t]>s[j]) t=j;

	  /*遍历找到的最值是否为初值指定位置i
	  若非,交换之。
	  如最值为s[3]而非初值s[1],交换两者,
	  从而第一个位置仍为最值*/
      if(t!=i)
      {  x=s[i]; s[i]=s[t]; s[t]=x; }
   }
   for(i=1,j=0; i<n; i=i+2, j++)  p[j]=s[i];
/**********found**********/
   p[j]='\0';
}
void main()
{  char  s[80]="baawrskjghzlicda", p[50];
   printf("\nThe original string is :  %s\n",s);
   fun(s,p);
   printf("\nThe result is :  %s\n",p);
}

B40 从小到大排序

在这里插入图片描述
修改前

#include <stdio.h>
#include <stdlib.h>

void fun ( int  n, int  *a )
{  int  i, j, p, t;
   for ( j = 0; j<n-1 ; j++ )
   {  p = j;
/************found************/
    for ( i=j+1; i<n-1 ; i++ )
      if ( a[p]>a[i] )
/************found************/
         t=i;
    if ( p!=j )
    { t = a[j]; a[j] = a[p]; a[p] = t; }
  }
}

void putarr( int  n,  int  *z )
{  int  i;
  for ( i = 1; i <=  n; i++, z++ )
  {  printf( "%4d", *z );
    if ( !( i%10 ) )  printf( "\n" );
  } printf("\n");
}
void main()
{  int  aa[20]={9,3,0,4,1,2,5,6,8,10,7}, n=11;
   printf( "\n\nBefore sorting %d numbers:\n", n ); putarr( n, aa );
   fun( n, aa );
   printf( "\nAfter sorting %d numbers:\n", n ); putarr( n, aa );
}

修改后

#include <stdio.h>
#include <stdlib.h>

void fun ( int  n, int  *a )
{  int  i, j, p, t;
   for ( j = 0; j<n-1 ; j++ )
   {  p = j;
/************found************/
    for ( i=j+1; i<=n-1 ; i++ )
      if ( a[p]>a[i] )
/************found************/
         p=i;
    if ( p!=j )
    { t = a[j]; a[j] = a[p]; a[p] = t; }
  }
}

void putarr( int  n,  int  *z )
{  int  i;
  for ( i = 1; i <=  n; i++, z++ )
  {  printf( "%4d", *z );
    if ( !( i%10 ) )  printf( "\n" );
  } printf("\n");
}
void main()
{  int  aa[20]={9,3,0,4,1,2,5,6,8,10,7}, n=11;
   printf( "\n\nBefore sorting %d numbers:\n", n ); putarr( n, aa );
   fun( n, aa );
   printf( "\nAfter sorting %d numbers:\n", n ); putarr( n, aa );
}


在这里插入图片描述
难度等级:★★★★★☆☆☆☆
学点啥
选择排序
在这里插入图片描述

C33.按分数降序排列

在这里插入图片描述

#include <stdio.h>
#define   N   16
typedef  struct
{  char  num[10];
   int   s;
} STREC;
void  fun( STREC  a[] )
{
	int i,j,len;
	STREC temp;;
	for (i=0;i<N;i++)
	{
		for (j = 0; j < N-1; j++)
		{
			if (a[j].s < a[j + 1].s)
			{
				temp = a[j];
				a[j] = a[j+1];
				a[j + 1] = temp;
			}		
		}
	}
}

void main()
{  STREC  s[N]={{"GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},
		{"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},
		{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},
		{"GA011",66},{"GA017",64},{"GA018",64},{"GA016",72}};
   int  i;FILE *out ;
   fun( s );
   printf("The data after sorted :\n");
   for(i=0;i<N; i++)
   {  if( (i)%4==0 )printf("\n");
      printf("%s  %4d  ",s[i].num,s[i].s);
   }
   printf("\n");
   out = fopen("out.dat","w") ;
   for(i=0;i<N; i++)
   {  if( (i)%4==0 && i) fprintf(out, "\n");
      fprintf(out, "%4d  ",s[i].s);
   }
   fprintf(out,"\n");
   fclose(out) ;
}

输出结果
在这里插入图片描述

难度等级:★★★☆☆
学点啥
经典的冒泡法:双层循环+if判断,外层循环控制比较轮数,内层循环控制两两比较。

for (j = 0; j < N-1; j++)
{
	if (a[j].s < a[j + 1].s)
	{
		temp = a[j];
		a[j] = a[j+1];
		a[j + 1] = temp;
	}		
}

从头到尾比较:1轮结束后,最值在最后,2轮结束后,次最值(倒数第2最值)在倒数第2…i轮结束后,倒数第i最值在倒数第i,注意第i轮比较只需要比较到N-i-1即可。

if (a[j].s < a[j + 1].s)//冒泡后,最小值在最后
//if (a[j].s > a[j + 1].s)//冒泡后,最大值在最后

最大值在后,排序结果
在这里插入图片描述

在这里插入代码片

输出结果
难度等级:★★★★★☆☆☆☆
学点啥

C49. 找出dp所指数组中的最小或最大值

在这里插入图片描述

雕虫小技

正儿八经

#include <stdio.h>
#include <stdlib.h>
#define N 10
#pragma warning (disable:4996)
void NONO(FILE *fp, int pd[], int n);

void fun (int *dp,int n,int upordown)
{
	int i, temp, index=0;

	if (n == 0) return;

	for (i = 1; i < n; i++)
	{
		if ((upordown == 0 && dp[i]<dp[index]) || (upordown == 1 && dp[i] > dp[index]))
			/*if (upordown == 0 && dp[i] < dp[index] || upordown == 1 && dp[i] > dp[index])
			  C语言中逻辑运算符“与”“或”“非”优先级:非>与>或
			*/
			index = i;//index存储目标元素
	}
	if (index != 0)
	{
		temp = dp[index];
		dp[index] = dp[0];
		dp[0] = temp;
	}
}


void display(int pd[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%4d",pd[i]);
	printf("\n");
}
void main()
{
	int data[N],i,n=N;
	FILE *out ;

    out = fopen("out.dat","w") ;
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,0);
	display(data,n);
	NONO(out, data, n);
	for(i=0;i<N;i++)
		data[i]=rand()%90+10;
	for(i=0;i<N-1;i++)
		fun(data+i,n-i,1);
	display(data,n);
	NONO(out, data, n);
	fclose(out);
}
void NONO(FILE *fp, int pd[], int n)
{
	int i;
	for(i=0;i<n;i++)
		fprintf(fp, "%4d", pd[i]);
	fprintf(fp, "\n");

}

在这里插入图片描述

难度等级:★★☆☆☆
学点啥
C语言中逻辑运算符“与”“或”“非”优先级是怎样的?非>与>或

单目运算符和双目运算符以及三目运算符

插入法排序

在这里插入图片描述

#include <stdio.h>
#include <string.h>
#define    N   80
void  insert(char  *aa)
{  int  i,j,n;     char  ch;
/**********found**********/
   n=strlen( aa );
   for( i=1; i<n ;i++ ) {
/**********found**********/
       ch=aa[i];
       j=i-1;
       while ((j>=0) && ( ch<aa[j] ))
       {   aa[j+1]=aa[j];
           j--;        
       }
       aa[j+1]=ch;
   }
}
void main( )
{   char  a[N]="QWERTYUIOPASDFGHJKLMNBVCXZ";
    printf ("The original string :       %s\n", a);
    insert(a) ;
    printf("The string after sorting :  %s\n\n",a );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值