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

来源:互联网 发布:linux定时重启机器 编辑:程序博客网 时间:2024/06/06 13:05

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

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

时间复杂度:

直接插入排序: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 <stdio.h>
#include <stdlib.h>

#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;
}

输出结果:



原创粉丝点击