插入排序
插入排序:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
下面就上图说明:
看这张图不知道大家可否理解了,在插入排序中,数组会被划分为两种,“有序数组块”和“无序数组块”,
对的,第一遍的时候从”无序数组块“中提取一个数20作为有序数组块。
第二遍的时候从”无序数组块“中提取一个数60有序的放到”有序数组块中“,也就是20,60。
第三遍的时候同理,不同的是发现10比有序数组的值都小,因此20,60位置后移,腾出一个位置让10插入。
然后按照这种规律就可以全部插入完毕。
伪代码:InsertSort(A,n) //Sorts A[1..n]
for j←2 to n
do key←A[j]
i←j-1
while i>0 and A[i]>key
do A[i+1]←A[i]
i←i-1
A[i+1]←key
以上插入排序伪代码。
上传C++源程序:
1 #include<iostream> 2 #include <ctime> //使用了time() 函数 3 #include <cstdlib> //使用了srand()函数 4 5 const int N=20005; 6 int a[N]; 7 using namespace std; 8 9 //插入排序 10 void InsertSort(int *a,int n) 11 { 12 //j从第2个数据开始到最后一个分别进行插入到前面即可完成排序 13 for (int j =2; j <=n; j++) 14 { 15 int key = a[j]; //拿出j位置的数进行向前扫描 16 int i=j-1; //i从j的前面一位开始 17 while(i>0&&a[i]>key) //满足条件时a[i]就后移,以便腾空插入 18 { 19 a[i+1]=a[i]; //后移一位置 20 i--; // 继续向前扫描 21 } 22 a[i+1]=key; //把原来的数插入你找到的位置,完成一遍的插入 23 24 } //插入n-1遍,整个数据就有序了 25 return ; 26 } 27 28 int main() 29 { 30 //随机产生n个数存入数组a中 31 int n=20000; 32 srand(int(time(0))); //利用时间函数time(),产生每次不同的随机数种子 33 for(int i=1;i<=n;i++) a[i]=rand(); //随机产生3000个数存于数组a中 (从1开始) 34 clock_t start = clock(); 35 InsertSort(a,n); //对数组a进行排序(从1开始) 36 clock_t end = clock(); 37 for(int i=1;i<=20;i++) cout<<a[i]<<' '; //输出前20个数据(已从小到大排序) 38 cout<<endl<<"插入排序耗时为:"<<end-start<<"ms"<<endl; 39 return 0; 40 }