数据结构之 排序---折半插入排序(时间复杂度 O(nlog2 n) )
排序
Time Limit: 1000MS Memory limit: 32678K
题目描述
给你N(N<=100)个数,请你按照从小到大的顺序输出。
输入
输入数据第一行是一个正整数N,第二行有N个整数。
输出
输出一行,从小到大输出这N个数,中间用空格隔开。
示例输入
5 1 4 3 2 5
示例输出
1 2 3 4 5
#include <math.h> #include <string.h> #include <stdio.h> #include <iostream> #include <string> #include <algorithm> using namespace std; //折半插入排序 void B_insertsort(int a[], int n) { int i, j; int mid, low, high; for(i=2; i<=n; i++) { a[0]=a[i]; //a[0] 只是我写的这个算法模板的“中转站”,实际数据存在下标: 1--->n 里面 low=1; high=i-1; while(low <= high) { mid = (low+high)/2; if(a[0]>a[mid]) // 此语句将决定是“由大到小” 还是 “由小到大”排序的顺序! low=mid+1; else high=mid-1; } for(j=i-1; j>=high+1; j--) { a[j+1]=a[j]; } a[high+1]=a[0]; } } int main() { int a[200]; int i, j; int n; while(~scanf("%d", &n)) { for(i=1; i<=n; i++) { cin>>a[i]; } B_insertsort(a, n); for(j=1; j<=n; j++) { if(j==1) cout<<a[j]; else cout<<" "<<a[j]; } cout<<endl; } return 0; }