排序总结----希尔排序

本文详细介绍了希尔排序算法,一种高效的插入排序改进版本。通过选择合理的增量序列,并对序列进行分割及直接插入排序,实现对原始数据的有效排序。文章还提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//
// Created by liyuanshuo on 2017/3/17.
//

#include "shell_sort.h"

/*
 * 希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。
 *
 * 希尔排序是基于插入排序的以下两点性质而提出改进方法的:
 *
 * 1、插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
 *
 * 2、但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位>
 */
/*
 * 1.选择一个增量序列t1, t2, t3 ..... tk 其中ti > tj (i>j), tk = 1;
 *
 * 2.按照增量序列的个数k,对原始序列进行k趟排序
 *
 * 3.每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。
 *
 * 仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
 */

void shell_insert_sort( int a[], int n, int dk )
{
	for (int i = dk; i < n; ++i)
	{
		if( a[i] < a[i-dk] )
		{
			int j = i - dk;
			int x = a[i];
			a[i] = a[i-dk];
			while ( x < a[j] )
			{
				a[j+dk] = a[j];
				j -= dk;
			}
			a[j+dk] = x;
		}
	}
}

void shell_sort( int a[], int n)
{
	int dk = n / 2;
	while ( dk >= 1 )
	{
		shell_insert_sort (a, n, dk);
		dk /= 2;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值