C语言之直接插入排序算法的方法

 更新时间:2021年12月22日 15:00:57   作者:绅士·永  
这篇文章主要为大家介绍了C语言直接插入排序算法的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

直接 插入排序 (Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。.

废话不多说先看看代码

#define  _CRT_SECURE_NO_WARNINGS 1
//直接插入排序法
#include <stdio.h>
void Compare(int arr[], int len)
{
	int i = 0;
	for (i = 0; i < len-1; i++)//len减一因为要插入的数是i+1
	{
		int M = i;//记录有序列表最后应该元素下标
		int num = arr[i + 1];//要插入的数
		while (M >= 0)
		{
			if (num < arr[M])//继续比较
			{
				arr[M + 1] = arr[M];//交换数值
				M--;
			}
			else
			{
				break;
			}
		}
		arr[M + 1] = num;
	}
}
int main()
{
	int arr[] = { 2,3,4,1,2,34,4,56,3,434,4 };
	int len = sizeof(arr) / 4;
	int i = 0;
	Compare(arr,len);
	for (i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

一、什么是直接插入排序

就像玩扑克时相同,假设前n-1项是有序数列,现在将第n项插入其中,使得前n项有序。然后依次进行插入,直到将整个数列全部插入,排序完成。

对于一组数据我们无法得知是否有序,但第一个元素只有一个,所以是有序的,所以将第一个元素作为第一个有序数列。后面的数值依次插入其中·。

二、代码讲解

void Compare(int arr[], int len)

首先创建一个插入排序的函数,需要传入数组和数据个数,因此创建int arr[],int len两个形参。

void Compare(int arr[], int len)
{
	int i = 0;
	for (i = 0; i < len-1; i++)//len减一因为要插入的数是i+1
	{
		int M = i;//记录有序列表最后应该元素下标
		int num = arr[i + 1];//要插入的数
		while (M >= 0)
		{
			if (num < arr[M])//继续比较
			{
				arr[M + 1] = arr[M];//交换数值
				M--;
			}
			else
			{
				break;
			}
		}
		arr[M + 1] = num;
	}
}

因为插入排序是由前一个和后一个数据进行比较的,所以比较次数为(数据个数-1)。

int M = i;//记录有序列表最后应该元素下标
		int num = arr[i + 1];//要插入的数

这里需要前后两个数据比较,且这两个需要比较的数据是变化的,所以创建表示两个数据的变量。

	while (M >= 0)
		{
			if (num < arr[M])//继续比较
			{
				arr[M + 1] = arr[M];//交换数值
				M--;
			}
			else
			{
				break;
			}
		}
		arr[M + 1] = num;

利用循环进行比较,如果后一个数比前一个数小,就交换位置(数值)。如果后一个数比前一个数更大,break跳出循环。

当每一次循环比较到最后一次时,需要将两个数进行最后的交换,因为之前只是将arr[M]的值赋给了arr[M+1],此时需要将arr[M+1]的值赋给arr[M]才算完成数值交换,否则会出现比较数据丢失和重复的问题。此时的M--了的,所以需要M+1得到所需要的数据下标进行交换。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C++实现当前时间动态显示的方法

    C++实现当前时间动态显示的方法

    这篇文章主要介绍了C++实现当前时间动态显示的方法,涉及C++时间操作及Sleep方法的使用,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C++输入流和输出流 超级详细

    C++输入流和输出流 超级详细

    C++ 的开发者认为数据输入和输出的过程也是数据传输的过程,数据像水一样从一个地方流动到另一个地方,所以 C++ 中将此过程称为“流”,实现此过程的类称为“流类”。下面小编将详细介绍这个话题,需要的朋友可以参考一下
    2021-09-09
  • C++实现多项式相乘

    C++实现多项式相乘

    这篇文章主要介绍了C++实现多项式相乘方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • c++的virtual和override作用及说明

    c++的virtual和override作用及说明

    这篇文章主要介绍了c++的virtual和override作用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C/C++实现通讯录管理系统(附源码)

    C/C++实现通讯录管理系统(附源码)

    这篇文章主要为大家详细介绍了如何利用C++实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-12-12
  • C语言小程序 如何判断两个日期之差

    C语言小程序 如何判断两个日期之差

    输入两个日期,计算之间相差多少天。 用了两种方法实现,第二种利用结构体,代码比较清晰,其余的都一样
    2013-07-07
  • 利用C++求绝对值的几种方法例子

    利用C++求绝对值的几种方法例子

    相信大家在学习C++时,应该都有做过求绝对值的题目,下面这篇文章主要给大家介绍了关于利用C++求绝对值的几种方法例子,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-04-04
  • C语言获取Linux系统精确时间的方法

    C语言获取Linux系统精确时间的方法

    下面小编就为大家带来一篇C语言获取Linux系统精确时间的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • C++类和对象基础详解

    C++类和对象基础详解

    类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数
    2021-08-08
  • ​​​​​​​C语言实现单链表基本操作方法

    ​​​​​​​C语言实现单链表基本操作方法

    这篇文章主要介绍了​​​​​​​C语言实现单链表基本操作方法,文章围绕主题展开详细介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05

最新评论