8639 折半插入排序
Description
用函数实现折半插入排序,并输出每趟排序的结果.
输入格式
第一行:键盘输入待排序关键的个数n
第二行:输入n个待排序关键字,用空格分隔数据
输出格式
每行输出一趟排序结果,数据之间用一个空格分隔
输入样例
10
5 4 8 0 9 3 2 6 7 1
输出样例
4 5 8 0 9 3 2 6 7 1
4 5 8 0 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 4 5 8 9 3 2 6 7 1
0 3 4 5 8 9 2 6 7 1
0 2 3 4 5 8 9 6 7 1
0 2 3 4 5 6 8 9 7 1
0 2 3 4 5 6 7 8 9 1
0 1 2 3 4 5 6 7 8 9
源码
#include<iostream>
#include<algorithm>
using namespace std;
int d[200000]; //定义一个足够大的数组
void Travers(int n) //遍历函数
{
for(int i=1;i<=n;i++)
cout<<d[i]<<" ";
cout<<endl;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) //d[0]不赋值,做哨兵
cin>>d[i];
int low,high,mid;
for(int i=2;i<=n;i++) //从第二个数开始
{
d[0]=d[i]; //将该数放入哨兵位置
low=1;high=i-1;
while(low<=high)
{
mid=(low+high)/2; //取中间位置
if(d[0]<d[mid]) //如果该数比中间值要小,则该值在mid的左边,否则,该值在mid的右边
high=mid-1;
else
low=mid+1;
}
for(int j=i-1;j>=high+1;j--) //找到插入的位置后,将该位置到该数原来的位置全部往右移
d[j+1]=d[j];
d[high+1]=d[0]; //将哨兵位置的数插入此位置
Travers(n); //每趟遍历
}
return 0;
}