希尔排序

概述

  希尔排序 ( Shell sort ) 属于插人类排序 , 但它对简单插入排序做了较大的改进

基本思想

  将整个无序序列分割成若干小的子序列分别进行插入排序

  将相隔某个增量 h 的元素构成一个子序列 ,在排序过程中 , 逐次减小这个增量

  当 h 减到 1 时 , 进行一次插入排序 , 排序就完成了

注意

  增量序列一般取,其中 n 为待排序序列的长度

  在希尔排序过程中,虽然对于每一个子表采用的仍是插入排序,但是,在子表中每进行一次比较就有可能移去整个线性表中的多个逆序,从而改善了整个过程的性能效率

  希尔排序的效率与所选取的增量序列有关,如果选取上述增量序列,在最坏的情况下,希尔排序所需要的比较次数为

示意图

  

程序代码

 1 /**
 2   ******************************************************************************
 3   * @file           : shell_sort.c
 4   * @brief          : 希尔排序函数及其使用范例
 5   ******************************************************************************
 6   * @attention
 7   *
 8   * 本程序参考了《计算机软件技术基础》3.3.2例程
 9   * 需要注意的是,本希尔排序文件中的void main()与其他排序文件中的完全相同
10   * 希尔排序算法本体为void shell_sort(T p[],int size)
11   * 使用测试及范例在void main()中
12   * 
13   ******************************************************************************
14   */
15 
16 #include<iostream>
17 #include<iomanip>
18 
19 using namespace std;
20 
21 /**
22   * @brief  希尔排序函数
23   * @param  p: 指向待排序数据的指针
24   * @param  size: 待排序数据的个数
25   * @retval 分界线位置
26   */
27 template<class T>
28 void shell_sort(T *p,int size)
29 {
30     int i,j,k;
31     T flag;
32     k=size/2;
33     while (k>0)
34     {
35         for(j=k;j<size-1;j++)
36         {
37             flag=p[j];
38             i=j-k;
39             while ((i>=0)&&(p[i]>flag))
40             {
41                 p[i+k]=p[i];
42                 i=i-k;
43             }
44             p[i+k]=flag;
45         }
46         k=k/2;
47     }
48     return;
49 }
50 
51 void main()
52 {
53     int i,j,k;
54     double p[50];
55     for(i=0,j=0;i<50;i++,j++)   //载入待排序序列
56     {
57         p[i]=j;
58         if(j==9)j=-1;
59     }
60     cout<<"排序前的序列"<<endl;
61     for(i=0,k=0;i<10;i++)
62     {
63         for(j=0;j<5;j++)
64         {
65             cout<<p[k]<<"   ";
66             k=k+1;
67         }
68         cout<<endl;
69     }
70     cout<<endl;
71     shell_sort(p,50);
72     cout<<"排序后的序列"<<endl;
73     for(i=0,k=0;i<10;i++)
74     {
75         for(j=0;j<5;j++)
76         {
77             cout<<p[k]<<"   ";
78             k=k+1;
79         }
80         cout<<endl;
81     }
82     cout<<endl;
83 }

 

posted @ 2020-04-14 08:39  曲杨  阅读(199)  评论(1)    收藏  举报