板子:
插入后,每次与中间值相比较,再与左半部分中间值比较,再与右半部份中间值比较,直到找到它自己的位置,
待排序数据:2,1,6,7,4 数据部分:原文https://www.jianshu.com/p/93926f680184
取第一个元素作为有序表,剩余的元素作为无序表
其中有序表:2;无序表:1,6,7,4
第一次比较,从无序表中取出第一个数 1,与中间值2比较,1<2,1插到2的前面,得到
有序表:1,2;无序表:6,7,4
第二次比较,从无序表中取出第一个数 6,与中间值1比较,6>1,要放在1的后面,再与后半区(有序表:2)的中间值2比较,6>2,6插入到2的后面,得到
有序表:1,2,6;无序表:7,4
第三次比较,从无序表中取出第一个数 7,与中间值2比较,7>2,7放在2后面,再与后半区(有序表:6)的中间值6比较,7>6,7放在6后面,得到
有序表:1,2,6,7;无序表:4
第四次比较,从无序表中取出第一个数 4,与中间值2比较,4>2,4放在2后面,再与后半区(有序表:6,7)的中间值6比较,4<6,4放在6前面,最终得到:
1,2,4,6,7
数组版本;
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 using namespace std; 5 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 void BinInsertSort(int A[], int n) 10 { 11 int i, j, low, mid, high, temp; 12 for(i = 1; i <= n-1; i++) 13 { 14 temp = A[i]; // 辅助变量temp用来保存待排序的元素 15 low = 0; 16 high = i-1; // 有序区间为[0,i-1] 17 while(low <= high) // 在有序区间内采用折半查找,找到插入位置 18 { 19 mid = (low + high)/2; 20 if(A[mid] > temp) 21 high = mid - 1; 22 else 23 low = mid + 1; 24 } 25 for(j = i-1; j >= high+1; j--) // 移动元素,腾出空间 26 A[j+1] = A[j]; 27 A[high+1] = temp; // 将待排序的元素插入 28 } 29 } 30 31 int main() 32 { 33 int n; 34 while(cin>>n){ 35 int nums[10010]; 36 for(int i =0;i<n;++i){ 37 cin>>nums[i]; 38 } 39 BinInsertSort(nums,n); 40 for(int i =0;i<n;++i){ 41 cout<<nums[i]<<" "; 42 } 43 } 44 return 0; 45 }
vector版本;
#include<iostream> #include<vector> #include<algorithm> using namespace std; void BinInsertSort(vector<int>& nums, int n) { vector<int> v; for(int i=nums.size()-1;i>=0; i--)//for(int i=0; i<num.size()-1; i++) { int l=0,r=v.size(); while(l<r) { int mid=(l+r)/2; if(nums[i]>v[mid]) l=mid+1; else r=mid; } v.insert(v.begin()+r,nums[i]); } for(vector<int> ::iterator it=v.begin();it!=v.end();it++) cout<<*it<<" "; } int main() { int n; while(cin>>n){ vector<int > nums(n); for(int i =0;i<n;++i){ cin>>nums[i]; } BinInsertSort(nums,n); } return 0;}
原文地址:https://www.cnblogs.com/sweetlittlebaby/p/12693153.html
时间: 2024-11-03 13:55:50