插入排序
1 /* 2 按从小到大排的序 3 */ 4 #include<iostream> 5 using namespace std; 6 int main(){ 7 int a[103]; 8 int n,temp,j; 9 cin>>n; 10 for(int i=0;i<n;i++) 11 cin>>a[i]; 12 for(int i=1;i<n;i++){//一共要插n-1个数 13 if(a[i]<a[i-1]){// 如何第i个数没有按照从小到大排 14 temp=a[i];//就将这个数提取出来 15 for(j=i-1;j>=0&&a[j]>temp;j--){//然后将i之前的序列看作是排好序的 16 //将temp插入到这个排好序的序列中 17 a[j+1]=a[j];//将a[j]向后移一位 18 } 19 a[j+1]=temp;//将temp插入 20 } 21 } 22 for(int i=0;i<n;i++)//输出 23 cout<<a[i]<<' '; 24 return 0; 25 }
插入排序的大致思路:
首先看这个数列a中,哪个数没有按照规定的顺序排列,如果发现了,就将它提取出来,存进temp中,这时将temp前边的所有数看成一个排好序的数列b(事实上,数列b确实是排好序的),我们现在要将temp插进这个数列b中去。
这时,就拿temp和数列b中的元素一个个比较,这里我们把目标设定为要从小到大排列,那么我们发现如果temp要是在这个排好序的数列b中的话,temp前边的元素应该比temp小或等于,temp后边的数应该比temp大或等于,那么这时我们就从数列b中从后往前找,找到第一个比temp小或等于的元素,然后把temp插入到它后边就行了,如果找遍整个数列b也没有发现有比temp小的数,那就把temp插入到最前面就好了。
那么如果和temp比较的数列b中的元素比temp大的话怎么办?这时我们就将这个元素往后挪一位(这里的往后挪一位非常粗糙,严格来讲这并不算挪,只是将这个元素后边的值也赋上了这个元素的值)
在挪一位的过程中,不会有任何覆盖任何有用的值,挪一位是为了给temp的插入提供地方
那么举个栗子
比如说 数列a为5 4 3 2 1 我们要用插入排序法将它按从小到大排序
从a[1]开始,也就是从4开始,发现它比它前边的数小,没有按照规定的顺序排列,那么就将它提取出来,存到temp中,然后将4之前的的所有数看成排好序的数列b,这时我们发现数列b里只有一个数5嘛~~~,只有一个数的话,也就没有什么排好序的说法了,我们就认为它排好序了,那么这时我们就要将temp插入到这个数列b中,然后拿5和4比较,发现5比4大,这时就将5往后挪一位,也就是将a[1]赋值为5,这时不要担心4被覆盖,因为temp中的值也是4,相当于已经将a[1]备份了
然后因为数列b只有一个,所以也只比较一次,比较完后我们发现,没有找到比temp还小的数,所以我们就把temp插入到最前面,也就是a[0]的位置,这时也不要担心a[0]被覆盖,因为a[0]已经向后挪了一位,也就是a[1]现在也是a[0]的值,排好之后,数列b就是4 5,然后继续从a[2]开始,也就是从3开始继续找,依此类推
O(∩_∩)O