插入排序(InsertSort)思想与实现

本文详细介绍了插入排序算法的工作原理,通过实例演示了排序过程,并提供了C++实现代码。

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

  在介绍插入排序的思想之前,说一下插入排序的一个重要的优点:插入排序只有在需要排序时才会排序。该算法的时间复杂度为:O(n^2),接下来我们来了解一下该排序的思想。

(1)插入排序的思想

  插入排序的思想就是:从数组的下标为0的元素出发,每次向后取一个元素,将该元素插入到前面已排好的子数组中,以排升序为例,将所要插入的元素插在左边小于该元素和右边大于该元素之间的位置,进而形成新的子数组,直到所有元素全插进来为止。为了更好的理解,我们来看下面的图片:

由以上图片中我们知道,原数组的顺序为:5   2   3   8   1。接下来进行分步操作。
  第一步:取数组第0个元素5,对5进行排序,结果形成了新的子数组为:5;
  第二步:取数组的第1个元素2,将2插入第一步所得的子数组中,发现2应该放在5的左边,将2插入5的左边后,结果形成了新的子数组为:2   5;
  第三步:取数组的第2个元素3,将3插入第二步所得的子数组中,发现3应该放在2和5的中间,将3插入2和5的中间后,结果形成了新的子数组为:2 3   5;
  第四步:取数组的第3个元素8,将8插入第三步所得的子数组中,发现8应该放在5的右边,将8插入5的右边后,结果形成了新的子数组为:2 3   5 8;
  第五步:取数组的第4个元素1,将1插入第四步所得的子数组中,发现1应该放在2的左边,将1插入2的左边后,结果形成了新的子数组为:1 2 3   5 8;
  最后,由于插入了所有的元素,故排序结束。

(2) 插入排序的实现

  本次实现采用C++的模版编程来完成该排序算法。

#include <iostream>
#include <iterator>

using namespace std;


template<class T,size_t N>
void PrintArr(T (&arr)[N]) {
	copy(arr,arr+N,ostream_iterator<T>(cout," "));
	cout << endl;
}

template<class T,size_t N>
void InsertSort(T (&arr)[N]) {
	for(size_t i=0,j; i<N; i++) {
		T temp(arr[i]);
		for(j=i; j>0 and temp < arr[j-1]; j--) {
		arr[j] = arr[j-1];
		}
		arr[j] = temp;
	}
}


template<class SortFunc>
void Test(SortFunc sort) {
	int arr[] = {5,2,3,8,1};
	cout << "InsertSort:"<<endl;
	sort(arr);
	PrintArr(arr);
}
   
int main(){
	Test(InsertSort<int,5>);
}
原始数组为:5   2   3   8   1
程序运行结果为:1   2   3   5   8




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值