希尔排序和shell之希尔排序

希尔排序

希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。

基本思想

先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。

如下图:


c++版

void ShellSort(int *array,int size)
{
	if (array == NULL || size < 0)
		return;
	int gap = size;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		for (int idx = gap; idx < size; ++idx)
		{
			int end = idx - gap;
			int temp = array[idx];
			while (end >= 0 && array[end] > temp)
			{
				array[end + gap] = array[end];
				end -= gap;
			}
			array[end+gap] = temp;
		}
	}
	for (int i = 0; i < 6; ++i)
	{
		cout << array[i] << " ";
	}
	cout << endl;
}

shell脚本版

#!/bin/bash

echo "shellsort"
function shellsort()
{	
	arr=(1 3 4 0 5 2 7 8)
	len=${#arr[*]}
	gap=$len
	while [ $gap -gt 1 ]
	do
		let gap=gap/3+1
		for((idx=gap;idx<len;idx++))
		do
			let end=idx-gap
			let temp=arr[idx]
			let save=${arr[$end]}
			while [ $end -ge 0 -a $save -gt $temp ]
			do
				let arr[end+gap]=arr[end]
				let end-=gap
				if [ $end -ge 0 ];then
					let save=arr[end]
				fi
			done
			let arr[end+gap]=temp
		done
	done
	echo ${arr[*]}
}
shellsort


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值