插入排序

 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

 

posted @ 2020-02-24 18:49  ice--cream  阅读(165)  评论(0编辑  收藏  举报