希尔排序和shell之希尔排序

来源:互联网 发布:大屏数据可视化 编辑:程序博客网 时间:2024/05/02 00:25

希尔排序

希尔排序(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/bashecho "shellsort"function shellsort(){arr=(1 3 4 0 5 2 7 8)len=${#arr[*]}gap=$lenwhile [ $gap -gt 1 ]dolet gap=gap/3+1for((idx=gap;idx<len;idx++))dolet end=idx-gaplet temp=arr[idx]let save=${arr[$end]}while [ $end -ge 0 -a $save -gt $temp ]dolet arr[end+gap]=arr[end]let end-=gapif [ $end -ge 0 ];thenlet save=arr[end]fidonelet arr[end+gap]=tempdonedoneecho ${arr[*]}}shellsort


原创粉丝点击