zoukankan      html  css  js  c++  java
  • hdu 2019:数列有序!(数据结构,直接插入排序+折半插入排序)

    数列有序!

    Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other)
    Total Submission(s) : 2   Accepted Submission(s) : 1

    Font: Times New Roman | Verdana | Georgia

    Font Size:  

    Problem Description

    有n(n<=100)个整数,已经按照从小到大顺序排列好,现在另外给一个整数x,请将该数插入到序列中,并使新的序列仍然有序。

    Input

    输入数据包含多个测试实例,每组数据由两行组成,第一行是n和m,第二行是已经有序的n个数的数列。n和m同时为0标示输入数据的结束,本行不做处理。

    Output

    对于每个测试实例,输出插入新的元素后的数列。

    Sample Input

    3 3
    1 2 4
    0 0

    Sample Output

    1 2 3 4

    Author

    lcy

    Source

    C语言程序设计练习(三)

     
      数据结构:插入排序,水题。
      训练插入排序思想的一道水题。思路是先查找出m应该插入的位置,然后将这个位置开始的数依次后推一位,再将m插入到这个位置。这里的查找可以用直接查找和折半查找两种,后者快一些。
      注意输出格式,最后一位数字后面不能有空格。
      AC代码:
     
    1)直接插入排序
     1 #include <iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int n,m;
     6     int a[111];
     7     while(cin>>n>>m){
     8         if(n==0 && m==0) break;
     9         for(int i=1;i<=n;i++)    //输入数列 
    10             cin>>a[i];
    11         for(int i=1;i<=n;i++){    
    12             if(m < a[i]){        //找到m应该插入的位置 
    13                 for(int j=n;j>=i;j--){    //从这个位置开始将数列依次后推一个格 
    14                     a[j+1] = a[j];
    15                 }
    16                 a[i] = m;    //将m放在这个位置上 
    17                 break;
    18             }
    19         }
    20         for(int i=1;i<=n+1;i++)    //输出数列
    21             if(i==n+1)
    22                 cout<<a[i]<<endl;
    23             else 
    24                 cout<<a[i]<<' ';
    25     }
    26     return 0;
    27 }
    2)折半插入排序
     1 #include <iostream>
     2 using namespace std;
     3 int main()
     4 {
     5     int n,m;
     6     int a[111];
     7     while(cin>>n>>m){
     8         if(n==0 && m==0) break;
     9         for(int i=1;i<=n;i++)    //输入数列 
    10             cin>>a[i];
    11         
    12         //折半查找 m 
    13         int left=1,right=n,mid;
    14         while(left<=right){
    15             mid = (left + right)/2;
    16             if(a[mid]<=m){
    17                 left = mid+1;
    18             }
    19             else 
    20                 right = mid-1;
    21         }
    22         //cout<<right+1<<endl;
    23         
    24         for(int j=n;j>=right+1;j--){    //从这个位置开始将数列依次后推一位 
    25             a[j+1] = a[j];
    26         }
    27         a[right+1] = m;    //将m放在这个位置上 
    28         
    29         for(int i=1;i<=n+1;i++)    //输出数列
    30             if(i==n+1)
    31                 cout<<a[i]<<endl;
    32             else 
    33                 cout<<a[i]<<' ';
    34     }
    35     return 0;
    36 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    JAVA获取昨天、今天、明天等日期
    IDEA设置调用方法时提示方法上的注释
    Hibernate使用distinct返回不重复的数据,使用group by 进行分组
    SpringBoot 自定义注解
    tailwindcss 使用总结
    nodejs nvm 包管理
    macos NPM 全局安装解决方案
    git 遇到修改github密码导致本地push失败解决方案
    Jupyter 快捷方式设置
    Vue indent eslint缩进webstorm冲突解决
  • 原文地址:https://www.cnblogs.com/yym2013/p/3552908.html
Copyright © 2011-2022 走看看