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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值