用随机数实现插入排序算法,并计算程序运行时间

插入排序

  • 插入排序算法是一种就地算法(空间用量是一个常数)
  • 我们希望排序的数也称为关键词(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;
	
}

插入排序n的数量和程序运行时间的关系

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/shujiaw/article/details/85163980