数据结构与算法分析-C++描述 第7章 插入排序(insertionSort)

本文深入解析了插入排序算法,包括其工作原理、行为描述、算法步骤及性能分析。通过实例代码展示了如何使用C++实现插入排序,并对算法的时间复杂度进行了讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

插入排序(insertionSort):

        插入排序是最简单的排序算法之一。插入排序由(N-1)趟排序组成,对于p = 1p = N - 1,插入排序保证从位置0到p上的元素已经为有序状态。

行为描述:

算法描述:

       在第p趟时,将位置p上的元素向左移动至前p+1个元素中适当的位置<整体前移再插入从而无需反复交换元素>

插入排序的性质:

       插入排序的界:\sum_{i=2}^{N} i = O(N^2)

一些简单排序算法(冒泡排序、选择排序)的下界:

       以数为成员的数组的逆序(inversion)是指具有i < ja[i]>a[j]的序偶(i,j)。显然,一次交换两个不按顺序排列的相邻元素消除一个逆序,而一个排过序的数组没有逆序。因此插入排序的运行时间为O(N+I),其中I为原始数组中的逆序数。于是,若逆序数是O(N),则插入排序以线性时间运行。

       定理:N个互异元素的数组的平均逆序数为N(N-1)/4 【设正序和逆序的数量各占一半】

       定理:通过交换相邻元素进行排序的任何算法平均需要\Omega (N^2)时间

插入排序实例:

//insertionSort.cpp
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

template<class Compareable>
void inserationSort(vector<Compareable> &v){
	int j;
	//traverse the vector
	for(int p  = 1; p < v.size(); p++){
		Compareable temp = v[p];
		//find the proper location
		for(j = p; j > 0 && temp < v[j - 1]; j--){
			v[j] = v[j - 1];
		}
		//insert into proper location
		v[j] = temp;
	}
}

int main(){
	int arr[] = {81, 94, 11, 96, 12, 35, 17, 95, 28, 58, 41, 75, 15};
	int len = sizeof(arr) / sizeof(arr[0]);
	vector<int> v;
	for(int i = 0 ; i < len; i++){
		v.push_back(arr[i]);
	}
	
	cout << "******* the original data ***********" << endl;
	for(typename vector<int>::iterator itr = v.begin(); itr != v.end(); ++itr){
		cout << *itr << " ";
	}
	cout << endl;
	
	cout << "******* the sorted data ***********" << endl;
	inserationSort(v);
	for(typename vector<int>::iterator itr = v.begin(); itr != v.end(); ++itr){
		cout << *itr << " ";
	}
	cout << endl;
	
	cout << " done ." << endl;
	return 0;
}

practice makes perfect !

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值