8.1 内部排序法---插入类排序(直接插入、折半、希尔)

插入类排序可以分为三种:直接插入折半插入、以及希尔排序

原理暂先忽略,以后再补。

时间复杂度:

直接插入排序:O(n^2)、折半插入排序:O(n^2)、希尔排序:O(n^3/2);

下面是相关的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/***********************************************************/
// 程序名称:InsertSort.cpp
// 程序目的:内部排序法---插入类排序
// 程序来源:数据结构与算法分析(C语言版) P-219
// 日期:2013-9-1 19:15:37 JohnnyHu修改
/***********************************************************/

#include 
#include 

#define Error( str )        FatalError( str )
#define FatalError( str )   fprintf( stderr,  "%s\n", str ), exit(  1 )

#define  MAX         5   
typedef  int ElementType;

void InsertionSort(ElementType a[],  int n);
void BinarySort(ElementType a[],  int n);
void ShellSort(ElementType a[],  int n);
void PrintSort(ElementType a[],  int n);

int main( void)
{
    ElementType data[MAX] = { 9644397588};

    printf( "排序前元素序列:\n");
    PrintSort(data, MAX);

     //InsertionSort(data, MAX);
     //BinarySort(data, MAX);
    ShellSort(data, MAX);

    printf( "排序后元素序列:\n");
    PrintSort(data, MAX);

     return  0;
}

/************************************************************************/
// 直接插入排序
/************************************************************************/

void InsertionSort(ElementType a[],  int n)
{
    ElementType tmp;
     for ( int i =  1; i < n; i++)
    {
        tmp = a[i];      // 取出第i个元素

         int j =  0;
         for (j = i; j >  0 && a[j -  1] > tmp; j--)   
        {  // 从后往前寻找插入位置
            a[j] = a[j -  1];
        }
        a[j] = tmp;      // a[i]插入正确位置
    }
}

/************************************************************************/
// 折半插入排序
/************************************************************************/

void BinarySort(ElementType a[],  int n)
{
     for ( int i =  0; i < n; i++)
    {
         int low, high;
        low =  0;
        high = i -  1;
        ElementType theValue = a[i];     // 待插入的元素
         while (low <= high)
        {
             int mid;
            mid = (low + high) /  2;
             if (theValue < a[mid])
                high = mid -  1// 上半区寻找插入位置
             else 
                low = mid +  1;
        }

         for ( int j = i; j > low; j--)
            a[j] = a[j -  1];
        a[low] = theValue;
    }
}

/************************************************************************/
// 希尔(插入)排序
/************************************************************************/

void ShellSort(ElementType a[],  int n)
{
     int delta;   // 增量
     for (delta = n /  2; delta >=  1; delta /=  2)
    {
         for ( int i = delta; i < n; i++)
        {
            ElementType tmp = a[i];  // 取出待排序的元素
             int j = i - delta;
             while (j >=  0 && a[j] > tmp)
            {
                a[j + delta] = a[j];
                j -= delta;
            }
            a[j + delta] = tmp;
        }
    }
}

// 打印元素序列
void PrintSort(ElementType a[],  int n)
{
     for ( int i =  0; i < n; i++)
        printf( "[%d]\t", a[i]);
    printf( "\n");

     return;
}

输出结果:

8.1 内部排序法---插入类排序(直接插入、折半、希尔)_第1张图片


你可能感兴趣的:(数据结构(C语言版)记录)