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
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