直接插入排序—C语言

直接插入排序(Insert Sort)稳定的一种排序

直接插入排序的思想:

  • 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
  • 第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
  • 直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。

例如给定一串数字    5    3     7    8     2

                                 j      i                   

让 arr[i] 为第二个数  j 从零号下标开始向后走,如果第一个数字大于第二个数字,进行交换,否则i+1,开始进行下一次循环。

#include<stdio.h>

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

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

int main()
{
	int arr[] = {5,3,7,8,2};
	int len = sizeof(arr)/sizeof(arr[0]);
	InsertSort(arr,len);
	Show(arr,len);
	return 0;
}

直接插入排序的时间复杂度为O(n^2) 最好情况为O(n)越有序越快,

空间复杂度为O(1)。

### C语言实现直接插入排序算法 直接插入排序是一种简单直观的排序方法,其基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。具体过程如下: #### 算法描述 对于长度为`n`的数组`a[]`,从第二个元素开始(即索引`i=1`),依次比较当前元素与前面已排序部分的元素,并将其插入到合适的位置[^1]。 以下是完整的C语言实现代码示例: ```c #include <stdio.h> void InsertionSort(int a[], int n) { int i, j, temp; for (i = 1; i < n; i++) { // 遍历整个数组 if (a[i] < a[i - 1]) { // 如果发现逆序情况 temp = a[i]; // 将该元素保存至临时变量 for (j = i - 1; j >= 0 && a[j] > temp; --j) { // 查找合适的插入位置 a[j + 1] = a[j]; // 移动较大的元素往后移位 } a[j + 1] = temp; // 插入到正确位置 } } } // 打印数组函数 void PrintArray(int a[], int n) { for (int i = 0; i < n; i++) { printf("%d ", a[i]); } printf("\n"); } int main() { int array[] = {58, 65, 49, 97, 76}; int size = sizeof(array) / sizeof(array[0]); printf("排序前: "); PrintArray(array, size); InsertionSort(array, size); // 调用插入排序函数 printf("排序后: "); PrintArray(array, size); return 0; } ``` #### 关键点解析 1. **外层循环**:从数组的第二个元素开始遍历,逐步扩展已排序区域。 2. **内层循环**:用于查找新元素在已排序部分中的适当位置,并将较大元素右移。 3. **哨兵优化**:某些情况下可以设置额外空间作为“哨兵”,减少边界条件判断的时间开销[^3]。 此程序实现了标准的直接插入排序逻辑并附带测试数据展示效果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值