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

原文地址:https://www.cnblogs.com/yym2013/p/3552908.html