直接插入法排序


本文试例在VS编译器下可正常使用


算法思想:每次从待排序的原始序列中取出一个元素,将其排入一个新的有序数列中,这实际上是一个有序子序列不断增长的过程,当有序子序列与原序列的长度一致时,排序完成。

假设有这个一个序列

初始状态:  {(5),6,3,9,2,7,1}

第1趟排序:{(6,5),3,9,2,7,1}

第2趟排序:{(6,5,3),9,2,7,1}

第3趟排序:{(9,6,5,3),2,7,1}

第4趟排序:{(9,6,5,3,2),7,1}

第5趟排序:{(9,7,6,5,3,2),1}

第6趟排序:{(9,7,6,5,3,2,1)}

//直接插入法排序函数主体
//参数1:待排序的序列
//参数2:序列的长度
//实现从大到小的排序
void insertSort(int array[],int arraySize)
{
	int i , j , tmp;
	for(i = 1 ; i < arrySize ; i++)	//循环遍历序列
	{
		tmp = array[i];
		j = i - 1;
		while(j >= 0 && tmp > array[j])	//j >= 0 是为了检测是否排序完全部
		{
			array[j + 1] = array[j--];
		}
		array[j + 1] = temp;
	}
}

 i         j

1        0                                    主循环第一趟
2        1、0                              主循环第二趟

3        2、1、0                        主循环第三趟

4        3、2、1、0                  主循环第四趟

5        4、3、2、1、0             主循环第五趟

6        5、4、3、2、1、0       主循环第六趟


while(j >= 0 && tmp >= array[j])

意思就是每次都会直接和有序序列的最后一个值进行比较,因为有序序列是按照从大到小来排列的,因此,如果他比最小的都还要小,也就不用再进行前面的比较了

直接执行array[j + 1] = temp;

把他插到有序序列的最后

倘若他比最后一个元素(最小值)要大,那他就会进入while的循环体中

其中

array[j + 1] = array[j--];

相当于

array[j + 1] = array[j];

j--;

意思就是如果发现tmp >= array[j](也就是tmp的值要大于已形成的有序序列中的第j个元素)

就将有序序列中的第j个元素往后移动一位(因为是从大到小排序)

然后再将j自减1,下一趟就是进行再往前(往前是更大的元素),进行比较

如果前面没有元素了,或者,前一个元素的值比当前要插入的值要大,则跳出while循环。

执行array[j + 1] = temp;

如此往复,直至比较完成。

完整代码

#include <stdio.h>

//直接插入法排序函数主体
//参数1:待排序的序列
//参数2:序列的长度
//实现从大到小的排序
void insertSort(int  array[],int arraySize)
{
	int i , j , tmp,k = 0;
	for(i = 1 ; i < arraySize ; i++)	
	{
		tmp = array[i]; 
		j = i - 1;		
    	while(j >= 0 && tmp > array[j])	
		{
			array[j + 1] = array[j--];
		}
		array[j + 1] = tmp;
	}
}


int main()
{
	int a[7] = {5,6,3,9,2,7,1};
	insertSort(a,7);	
	int i = 0;
	for(i = 0 ; i < 7 ; i++)
	{
		printf("%d",a[i]);
	}
	printf("\n");
	return 0;
}

文章的最后,我还有点话想和大家说,如果我将这个程序放到gcc编译器(Linux操作系统)中去编译再运行,当然你也可以去尝试一下,你会发现,此时,排序算法好像不行了,真的是排序算法不行了吗?其实是编译器的问题。

感兴趣的可以移步我的另一篇博文

编译器的差别gcc和VS_翔在天上飞的博客-CSDN博客icon-default.png?t=M85Bhttps://blog.csdn.net/qq_45570844/article/details/126691414?spm=1001.2014.3001.5501

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

翔在天上飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值