c++基本排序之插入排序

1.插入排序简介
插入排序是一种比较直观简单的排序方法,同时也是基于比较方法的排序。插入排序有点类似于打扑克时给扑克排序的方法,每一次摸完牌都会从后往前逐个比较手上的牌和摸到牌的大小,直到找到合适的位置就把摸到的牌插入。插入排序的工作原理也是如此。在进行插入排序时,我们也可以把元素区域分成有序区和无序区,每一次都把无序区的第一个元素从有序区的末尾由后往前比较,如果待排序的元素小于与之比较的元素,就把该元素往后移一位。

2.算法描述
插入排序的算法描述如下:
从第一个元素开始,该元素可以认为已经被排序

取出下一个元素,在已经排序的元素序列中从后向前扫描

如果该元素(已排序)大于新元素,将该元素移到下一位置

重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

将新元素插入到该位置后

重复步骤2~5。
下面先由一个简单的例子看一下具体的操作:
例如有需要排序的数组:3,2,4,1,5
按照算法描述,默认3是有序的,现在从第二个元素即元素2开始比较:2比3小,3往后移动一位,再往前比较是没有元素的,所以第一次比较结束,结果如下:
2,3,4,1,5;
第二次从第三个元素即元素4开始比较:发现4大于有序区的最后一个元素3,则比较结束,4就在3的后面。排序结果如下:
2,3,4,1,5;
第三次从第四个元素即元素1开始比较:1小于4,4往后移,1小于3,3往后移,1,小于2,2往后移,比较结束,排序结果如下:
1,2,3,4,5;
第四次从第五个元素即元素5开始比较:5比4大,则比较结束,排序结果如下:
1,2,3,4,5;
具体的代码实现如下:

#include <iostream>
using namespace std;
void insert(int data[],int n)
{
	for(int j = 1;j<n;j++)
	{
		int x = data[j];//待排序的第一个元素 
		int index = j-1;//表示与待排序元素比较的元素的下标,从待排序的前一个元素开始比较 
		while(index>=0&&x<data[index])
		{//由后往前比较,如果待排序元素小于前一个元素,则前一个元素往后移动一位 ;
 
			data[index+1] = data[index];//把已排序的元素往后移动一位 
			index--;//待排序的元素再往前比较  
		}
		//while循环退出说明,待排序的元素是大于或等于index下标的这个元素,
		data[index+1] = x; //则待排序的元素排在index下标后面即待排序元素下标就是index+1; 
		cout << "本次排序结果如下:" ;
		for(int i  = 0;i<n;i++)
		{
			cout << data[i] << "  ";
		} 
		cout << endl;
	}
}
int main()
{
	int a[10] = {2,1,3,8,6,5,9,0,4,7};
	cout << "需要排序的元素如下:" ;
	for(int i = 0;i<10;i++)
	{
		cout <<a[i] << "  ";
	}
	cout << endl;
	insert(a,10);
	cout << "排序后的元素如下:";
	for(int i = 0;i<10;i++)
	{
		cout << a[i] << "  ";
	}
	cout << endl;
	return 0; 
}

运行程序,结果如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值