插入排序
- 插入排序算法是一种就地算法(空间用量是一个常数)
- 我们希望排序的数也称为关键词(key),也就是说对一系列 key 进行排序。
- 输入是以一个数组表示的。
- 相对于归并排序来说,该算法对小规模数据的效率比较高。
插入排序算法思想:
每趟将一个元素,按照其关键字的大小插入到它前面已经排序的子序列中,依此重复,直到插入全部元素。
插入排序包括:直接插入排序、二分插入排序以及希尔排序。
插入排序的伪代码
for j = 2 to A.length
key = A[j]
// Insert A[j] into the sorted sequence A[1..j-1].
i = j-1
while i > 0 and A[i] > key
A[i+1] = A[i]
i = i -1
A[i+1] = key
以数组A={5,2,4,6,1,3}为例介绍插入排序
int a[6]= {5,2,4,6,1,3};
for(i = 1;i<6;i++) //1
{
int key = a[i]; //2
j = i-1; //3
while(j>=0 && a[j]>key) //4
{
a[j+1] = a[j]; //5
j=j-1; //6
}
a[j+1] = key; //7
}
第一步:
程序运行到 1:i = 1 ;
程序运行到 2:i = 1 ;a[i] = a[1] = 2 = key;
程序运行到 3:i = 1 ;j = 0;
程序运行到 4:i = 1 ;j = 0; a[i] = a[1] = 2 = key;a[j] = a[0] = 5;(满足while循环的条件,所以进入while循环体内)
程序运行到 5:i = 1 ;j = 0; a[j] = a[0] = 5;a[j+1] =a[j] = 5;(这里将5向后移一步),此时数组为A ={5,5,4,6,1,3}
程序运行到 6:i = 1 ;j = -1; 此时数组为A ={5,5,4,6,1,3}
此时程序重新返回 4:由于此时j = -1,不满足while循环条件,所以跳出循环;
程序运行到 7:i = 1 ;j = -1; key=2,a[j+1] = a[0] = 2;此时数组为A ={2,5,4,6,1,3}
此时程序重新返回 1;
插入排序的代码实现
//插入排序算法的实现
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
int main()
{
int n;
cout << "请输入将要排序的数的个数:" << endl;
cin >> n;
/*随机数种子*/
srand ((unsigned) time (NULL));
/*向量数组*/
vector <int> vec;
for (int i =0; i< n; i++)
{
vec.push_back(rand());
cout << vec[i] << endl;
}
clock_t start,finish;
float totaltime;
start = clock();
for(int j = 1;j<n;j++)
{
int key = vec[j];
int k = j - 1;
while(k>=0 && vec[k]>key)
{
vec[k+1] = vec[k];
k = k-1;
}
vec[k+1] = key;
}
finish = clock();
totaltime = (float)(finish - start)/CLOCKS_PER_SEC;
cout<<"插入排序之后:"<<endl;
for(int i = 0; i<n; i++)
{
cout<<vec[i]<<endl;
}
cout << "\n此程序运行的时间为:"<<totaltime <<"秒!"<<endl;
}