插入排序与希尔排序

一、插入排序:

插入排序,顾名思义就是将所要排序时的那个插入进有序的数字里面。

void InserSort(int* a,int n)
{
	for (int i = 1; i < n; i++)
	{
		int end = i - 1;
		int tmp = a[i];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				end--;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

二、希尔排序:

插入排序时希尔排序的一种特殊情况。

希尔排序就是将一组数据分为gap(一个整数)组,然后对每一组进行排序,是对插入排序的一种优化,然后继续重复上述分组和排序,当gap=1时,就排好序了。

下图就是gap = 3的分组情况。(红色一组,蓝色一组,绿色一组)

希尔排序:

1、首先分为若干组

2、对每一个子组进行插入排序,与上面不一样的就是每次都要跳过gap个元素。

3、逐渐减小gap的值,减小跳过的元素。

4、最后在进行一次插入排序即可

(这样感觉是不是很麻烦,但是因为每一次跳过的元素很多,比如说我有个数组9,8,7,6,5,4,3,2,1如果插入排序9就会要走8次,但是如果我对它进行分组之后,9就只走了3次,所以实际上希尔排序是比插入排序更快的)

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

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap /= 2;//最后一次gap就等于1了
		for (int i = 0; i < n - gap; i++)
		{
			int end = i;
			int tmp = a[i + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}
void TestShellSort()
{
	int a[] = { 2,3,7,1,9,1,7,8,5,4 };
	int n = sizeof(a) / sizeof(a[0]);
	Print(a, n);
	ShellSort(a, n);
	Print(a, n);
}
int main()
{
	TestShellSort();
	return 0;
}
  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
插入排序希尔排序都是常见的排序算法,适用于C语言编程。 插入排序是一种简单直观的排序算法,它的基本思想是将待排序的元素逐个插入到已排序序列中的适当位置,直到全部元素都插入完毕。具体实现时,可以使用两重循环,外层循环控制待插入的元素,内层循环将待插入元素与已排序序列中的元素进行比较并移动位置。\[2\] 希尔排序插入排序的一种改进算法,它通过将待排序序列分割成若干个子序列,对每个子序列进行插入排序,然后逐步缩小子序列的间隔,最终完成整个序列的排序。希尔排序的关键在于选择合适的间隔序列,常用的间隔序列有希尔增量序列和Hibbard增量序列等。\[2\] 以下是插入排序希尔排序的C语言代码示例: 插入排序: ```c void InsertionSort(int arr\[\], int n) { int i, j, key; for (i = 1; i < n; i++) { key = arr\[i\]; j = i - 1; while (j >= 0 && arr\[j\] > key) { arr\[j + 1\] = arr\[j\]; j--; } arr\[j + 1\] = key; } } ``` 希尔排序: ```c void ShellSort(int arr\[\], int n) { int gap, i, j, temp; for (gap = n / 2; gap > 0; gap /= 2) { for (i = gap; i < n; i++) { temp = arr\[i\]; for (j = i; j >= gap && arr\[j - gap\] > temp; j -= gap) { arr\[j\] = arr\[j - gap\]; } arr\[j\] = temp; } } } ``` 以上是插入排序希尔排序的简单实现,你可以根据需要进行修改和优化。 #### 引用[.reference_title] - *1* *2* *3* [C语言实现排序算法:冒泡排序、插入排序希尔排序、堆排序、归并排序](https://blog.csdn.net/m0_72084056/article/details/126280789)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值