排序2:直接插入排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39087263/article/details/85274483

.概述

1.插入排序: 每一趟,将待排序的序列记录,根据待排序关键字大小插入到有序队列合适位置当中,直到所有数列按照大小要求完成。

2.直接插入排序:最简单的一种插入排序,每次将待排序的的数字直接插入到整个序列的合适位置当中。

二.算法思想

将第 i个记录插入到前面 i-1(此处设位 j )个已排序的记录中 的记录中 ,将 i 记录的关键字 temp,顺次与前面 ,已经记录的关键字比 较,所有比 temp大的依次向后移动一个位置,直到遇比 temp小的或相等的数字,插入到后面。

假设有一组无序序列 R0, R1, … , RN-1。

(1) 我们先将这个序列中下标为 0 的元素视为元素个数为 1 的有序序列。

(2) 然后,我们要依次把 R1, R2, … , RN-1 插入到这个有序序列中。所以,我们需要一个外部循环,从下标 1 扫描到 N-1 。

(3) 接下来描述插入过程。假设这是要将 Ri 插入到前面有序的序列中。由前面所述,我们可知,插入Ri时,前 i-1 个数肯定已经是有序了。

示例:一组无序数据 例: 3,7,2,8,5,6

设置一个 下标 i , 一个下标 j ,一个变量 temp 用来存储当待比较的数据

初始 i = 0 ; i从0号元素开始

j = i -1 ; j 从 i的前一个元素开始

三.时间复杂度和空间复杂度

      当数据为正序时,时间复杂度最低,为O(n),

      当数据为逆序时,之间复杂度最高,为O(n^2);

      所以,数据越接近正序,算法性能越好。

      由于在交换数据时,需要一个临时变量,所以空间复杂度为 O(1);

      由于在排序时,不需要改变相等元素的位置,所以直接插入排序是一种稳定的算法。

四.代码

/*
Date:2018/12/27
From:mohican
*/
#include<stdio.h>
//直接插入排序    
//类似于扑克牌   接牌的过程  与选择排序有点类似 
//设置一个tmp 把 当前i 的值 放在tmp里面,每个数据和tmp进行比较,如果是降序
//  pcur >  tmp ==>   pcur -->赋给 tmp  ,再把 i+1的值赋给 pcur ; j-- ,继续和tmp进行比较   

void InsertSort(int *arr,int len)
{
	int temp = 0;
	int j =0;
	for(int i =0;i<len;++i)
	{
		int temp = arr[i];
	    for( j = i-1;j>=0;--j)
		{
			if(arr[j] >temp)
			{
				arr[j+1] = arr[j];
			}
			else
			{
				break;
			}
		}
		arr[j+1] = temp;
	}
}

void show(int *arr,int len)
{
	for(int i =0;i<len;++i)
	{
		printf("%d\t",arr[i]);
	}
}

int main()
{
	int arr[]={7,3,4,6,4,2.876,3,53,346};
	int len = sizeof(arr)/sizeof(arr[0]);
	InsertSort(arr,len);
	show(arr,len);
	getchar();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_39087263/article/details/85274483