算法 - 希尔排序(C)

/*
ShellSort.c - by Chimomo
希尔排序又称“缩小增量排序”,是对直接插入排序方法的改进。
希尔排序的基本思想是:先将整个待排序序列分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
具体做法是:先取一个小于n的整数d1作为第一个增量,将所有距离为d1倍数的记录放在同一个组中,从而把全部记录分成d1组,在各组内进行直接插入排序;然后取第二个增量d2(d2<d1),重复上述分组和排序工作,依此类推,直至所取的增量di=1(di<...<d2<d1),即所有记录放在同一组进行直接插入排序为止。
希尔排序是不稳定的排序方法。
*/

void ShellSort(int data[], int n)
{
    int *delta, k, i, t, dk, j;
    /*从k = n开始,重复k = k / 2运算,直到k = 0,所得k值的序列作为增量序列存入delta*/
    k = n;
    delta = (int *)malloc(sizeof(int) * (n / 2));
    i = 0;
    do
    {
        k = k / 2;
        delta[i++] = k;
    }
    while(k > 0);
    i = 0;
    while((dk = delta[i]) > 0)
    {
        for(k = delta[i]; k < n; ++k)
        {
            /*将元素data[k]插入到有序增量子表中*/
            if(data[k] < data[k - dk])
            {
                /*备份待插入的元素,空出一个元素位置*/
                t = data[k];
                for(j = k - dk; j >= 0 && t < data[j]; j -= dk)
                {
                    /*寻找插入位置的同时元素后移*/
                    data[j + dk] = data[j];
                }
                /*找到插入位置,插入元素*/
                data[j + dk] = t;
            }
        }
        /*取下一个增量值*/
        ++i;
    }
}
/*
Main.c - by Chimomo
*/

main()
{
	int i, a[] = {48, 37, 64, 96, 75, 12, 26, 48, 54, 3};
	printf("Original array:\n");
	for(i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	ShellSort(a, 10);
	printf("Shell sorted array:\n");
	for(i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}
时间: 2024-09-30 00:37:22

算法 - 希尔排序(C)的相关文章

(转载)经典排序算法-希尔排序

经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每

经典排序算法 - 希尔排序Shell sort

经典排序算法 - 希尔排序Shell sort 希尔排序Shell Sort是基于插入排序的一种改进,同样分成两部分, 第一部分,希尔排序介绍 第二部分,如何选取关键字,选取关键字是希尔排序的关键 第一块希尔排序介绍 准备待排数组[6 2 4 1 5 9] 首先需要选取关键字,例如关键是3和1(第一步分成三组,第二步分成一组),那么待排数组分成了以下三个虚拟组: [6 1]一组 [2 5]二组 [4 9]三组 看仔细啊,不是临近的两个数字分组,而是3(分成了三组)的倍数的数字分成了一组, 就是每

算法 希尔排序

希尔排序 Shell Sort 介绍: 希尔排序(Shell Sort)也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率比直接插入排序有较大提高. 执行流程: 首先

排序算法——希尔排序

希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法. 该方法因DL.Shell于1959年提出而得名. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多, 当增量减至1时,整个文件恰被分成一组,算法便终止. 代码实现 void shellsort(int a[],int n) { int gap=0,i=0,temp=0,j=0; for(

算法----希尔排序(shell sort)

在分析插入排序的算法性能的过程时知道,当数组规模较小或者存在较多的有序子序列时,插入排序将会在很短的时间内完成数组的排序,为此可以设计一个单调序列h[n],将数组分为多个小的序列,然后这些小的序列使用插入排序.h[n]={1,4,7,10,13,16,19--,3*x+1}. 算法实现: void sort::shell_sort(int* a, const int n) { int h = 0; while (h<n/3) h = 3*h + 1; while(h>=1) { for(int

排序算法-希尔排序

希尔排序,插入排序的升级排版 先回顾插入排序 1从集合第二个元素开始(外循环开始) 2取出该元素 标记为C 3从该元素开始,向前遍历,如果元素大于C,则该元素向后移动一位(内循环) 4直到找到一个小于或者等于C元素(或者到达集合头部),将C放在这个元素的下一位(或者集合头部) 重复1(注意选取下一个元素)(外循环第一趟完成,进入第二趟循环) 可以发现问题: 数组:  5,1,2,3,4,0,6,7,8,9 按照从小到大排序会使得多个元素交换位子,这是比较消耗性能的,这里使用希尔排序会高效很多 希

经典排序算法--希尔排序

算法简介 希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进.希尔排序又叫缩小增量排序. 白话理解: 我们依然已排队为例,加入队伍中,有一些小个子站在了队伍的后面,而一些大个子又站在了队伍的前面,这是如果再使用插入排序,那就太没有效率了.通常情况下,老师会先看一眼,然后将后面的小个子和前面的大个子互换位置.当这个队伍顺序差距不是特别明显后,再使用插入排序. 但是计算机没办法一眼看出来哪些元素差距比较大,于是我们可以每趟排序,根据对应的增量,将待排序列分割成若干长度为m

常见排序算法-----希尔排序

1 // 原理 :用grap(希尔增量)将大数据组进行分组 对每一组进行排序 2 // 在写算法的时候,可以从第grap(希尔增量)个元素开始比较,每次减少grap 即可与同一组的上个元素进行比较,当遍历完一次后 3 // grap/2,继续循环,直到grap >0; 4 5 // 插入版 6 public static void shellSort(int[] arr) { 7 int grap = arr.length >> 1; 8 9 for (; grap > 0; gr

&lt;排序算法&gt; 希尔排序ShellSort

1.核心思想:希尔排序是插入排序的一种,是直接插入排序的一种改进版本,他们同属于插入排序类.这是一个不稳定的排序算法.采取跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序.2.代码实现: 1 #include<iostream> 2 using namespace std; 3 4 void PrintArr(int arr[],int len); 5 void ShellSort(int arr[],int

经典排序算法——希尔排序

注:本文参考https://www.cnblogs.com/chengxiao/p/6104371.html 希尔排序原理 在讲解希尔排序之前,我们有必要先回头看一下插入排序的问题.插入排序不管数组分布时怎么样的,都是一步步的对元素进行比较,移动,插入.比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位很费劲,比较和移动元素均需n-1次.这时就引出了希尔排序. 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过