zoukankan      html  css  js  c++  java
  • 数据结构排序-希尔排序

    希尔排序也是插入排序的一种,但是它效率高于直接插入排序。

    基本思想是:

    首先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;

    然后,取第二个增量d2<的重复上述的分组和排序,直到所取的增量dt=1。

    增量序列尤其关键,一般的初次取序列的一半为增量,以后每次减半,直到增量为1.

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int n;
     5 
     6 /*
     7  * 希尔排序
     8  */
     9 void ShellSort(int *array)
    10 {
    11     int k = n / 2; //增量序列(仅作举例)
    12     while (k > 0)
    13     {
    14         int i, j;
    15         for (i = k + 1; i <=n; i++)
    16         {
    17             if (array[i] < array[i - k])
    18             {
    19                 array[0] = array[i];
    20                 for (j = i - k; j > 0 && array[0] < array[j]; j -= k)
    21                 {
    22                     array[j + k] = array[j];
    23                 }
    24                 array[j + k] = array[0];
    25             }
    26         }
    27         k = k / 2;
    28     }
    29 }
    30 
    31 int main()
    32 {
    33     int i;
    34     int *array;
    35     printf("请输入数组的大小:");
    36     scanf("%d", &n);
    37     array = (int*) malloc(sizeof(int) * (n + 1));
    38     printf("请输入数据(用空格分隔):");
    39     for (i = 1; i <= n; i++)
    40     {
    41         scanf("%d", &array[i]);
    42     }
    43     ShellSort(array);
    44     printf("排序后为:");
    45     for (i = 1; i <= n; i++)
    46     {
    47         printf("%d ", array[i]);
    48     }
    49     printf("
    ");
    50 }

    直接插入排序是稳定的,最坏时间复杂度为O(n^2),空间复杂度为O(1).

    希尔排序是不稳定的,时间复杂度跟增量序列有关,取的增量序列要保证其中的值没有除1之外的公因子,并且最后一个增量必为1.

  • 相关阅读:
    Timer类的常见使用方法
    转:HTTP协议简介
    DS-5新加交叉编译工具
    C++的引用
    C++构造函数的几种使用方法
    Eclipse 快捷键
    eclipse Outline里图标的含义
    Linux 内存映射函数 mmap()函数详解
    Sockit 硬件接口编程——点亮一个LED
    更新Preloader与uboot
  • 原文地址:https://www.cnblogs.com/niceforbear/p/4534489.html
Copyright © 2011-2022 走看看