zoukankan      html  css  js  c++  java
  • 备战考研算法笔记(五)成绩排序

    题目描述:

    用一维数组存储学号和成绩,然后,按成绩排序输出。

    输入:

    输入第一行包括一个整数N(1<=N<=100),代表学生的个数。
    接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。

    输出:

    按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。
    如果学生的成绩相同,则按照学号的大小进行从小到大排序。

    样例输入:
    3
    1 90
    2 87
    3 92
    样例输出:
    2 87
    1 90
    3 92
     1 #include <stdio.h>
     2 #include "StdAfx.h"
     3 #include <malloc.h>
     4 
     5 //快速排序
     6 void quick_sort(int s[], int l, int r,int stu[])
     7 {
     8     if (l < r)
     9     {
    10               
    11         int i = l, j = r, x = s[l],y=stu[l];
    12         while (i < j)
    13         {
    14             while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
    15                             j--; 
    16             if(i < j)
    17                          {   s[i++] = s[j];
    18             stu[i-1]=stu[j];}
    19             
    20             while(i < j && s[i] <x) // 从左向右找第一个大于等于x的数
    21                             i++; 
    22             if(i < j)
    23             {
    24                 if(s[i]==x)
    25                 {
    26                     if(stu[i]>y)
    27                     {
    28                             s[j--] = s[i];
    29                             stu[j+1]=stu[i];
    30                     }
    31                 }
    32                 else
    33                 {  
    34                             s[j--] = s[i];
    35                             stu[j+1]=stu[i];
    36                 }
    37             }
    38         }
    39         s[i] = x;
    40         stu[i]=y;
    41         quick_sort(s, l, i - 1,stu); // 递归调用
    42         quick_sort(s, i + 1, r,stu);
    43     }
    44 }
    45 
    46 int main()
    47 {
    48   int length;
    49   while(scanf("%d",&length)!=EOF&&length>=1&&length<=100)
    50   {
    51     int *stu;
    52     int *grade;
    53     stu=(int*)malloc(length*sizeof(int));
    54     grade=(int*)malloc(length*sizeof(int));
    55     for(int i=0;i<length;i++)
    56     {
    57         scanf("%d %d",&stu[i],&grade[i]);
    58     }
    59     quick_sort(grade,0,length-1,stu);
    60     //printf("
    ");
    61     for(int i=0;i<length;i++)
    62     {
    63         printf("%d %d
    ",stu[i],grade[i]);
    64     }
    65   }
    66 
    67   return 0;
    68 }

    又是WA,我也不知道原因,真是蛋疼啊!

     的确发现了错误,但不知道原因,难道这里不适合用快速排序?

     后来发现了问题,理解了快速排序的精髓

    #include <stdio.h>
     
    #include <malloc.h>
     
    //快速排序
    void quick_sort(int s[], int l, int r,int stu[])
    {
        if (l < r)
        {
                   
            int i = l, j = r, x = s[l],y=stu[l];
            while (i < j)
            {
                while(i < j && (s[j] > x||(s[j]==x&&stu[j]>y)))// 从右向左找第一个小于x的数 或者等于x但是学号小于y
                                j--; 
     
                if(i < j)
                {
                     
                         s[i++] = s[j];
                         stu[i-1]=stu[j];
                      
                }
                while(i < j && (s[i] <x||(s[i]==x&&stu[i]<y))) // 从左向右找第一个大于x的数或者等于x但是学号大于y
                                i++; 
                if(i < j)
                {
                                s[j--] = s[i];
                                stu[j+1]=stu[i];
                     
                }
            }
            s[i] = x;
            stu[i]=y;
            quick_sort(s, l, i - 1,stu); // 递归调用
            quick_sort(s, i + 1, r,stu);
        }
    }
     
    int main()
    {
      int length;
      while(scanf("%d",&length)!=EOF&&length>=1&&length<=100)
      {
        int *stu;
        int *grade;
        stu=(int*)malloc(length*sizeof(int));
        grade=(int*)malloc(length*sizeof(int));
        for(int i=0;i<length;i++)
        {
            scanf("%d %d",&stu[i],&grade[i]);
        }
        quick_sort(grade,0,length-1,stu);
        //printf("
    ");
        for(int i=0;i<length;i++)
        {
            printf("%d %d
    ",stu[i],grade[i]);
        }
      }
     
      return 0;
    }
    /**************************************************************
        Problem: 1196
        User: joilee
        Language: C++
        Result: Accepted
        Time:40 ms
        Memory:1416 kb
    ****************************************************************/
  • 相关阅读:
    VBA 如何检测一个中文字符串是否包含在另一个字符串中
    RFC2119 规范内容
    Android 解读Event和Main Log
    为知笔记发布博客地址
    理解 Android Build 系统
    皮肤病
    关于Android中50M+的文本入库处理细节
    at java.lang.AbstractStringBuilder.toString
    java.lang.AbstractStringBuilder.enlargeBuffer
    关于手机定位轨迹的算法逻辑
  • 原文地址:https://www.cnblogs.com/ligen/p/3266067.html
Copyright © 2011-2022 走看看