8.1 内部排序法---插入类排序(直接插入、折半、希尔)
来源:互联网 发布:linux定时重启机器 编辑:程序博客网 时间:2024/06/06 13:05
插入类排序可以分为三种:直接插入、折半插入、以及希尔排序。
原理暂先忽略,以后再补。
时间复杂度:
直接插入排序:O(n^2)、折半插入排序:O(n^2)、希尔排序:O(n^3/2);
下面是相关的示例:
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] = {96, 44, 39, 75, 88};
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;
}
// 程序名称: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] = {96, 44, 39, 75, 88};
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 内部排序法---插入类排序(直接插入、折半、希尔)
- 内部排序之插入排序:直接插入排序,折半插入排序,希尔排序
- 插入排序(希尔排序、直接插入、折半插入排序)
- 插入排序:直接插入排序,折半查找排序,希尔排序
- 排序算法--直接插入排序、折半插入排序、希尔排序
- 插入排序:直接插入, 折半插入,希尔插入
- 直接插入排序 && 折半插入排序 && 希尔排序
- 直接插入排序,折半插入排序,希尔排序
- 直接插入排序、折半插入排序、希尔排序
- 【插入排序】直接,折半,二路,希尔
- 【插入排序】直接,折半,二路,希尔
- 插入排序(直接插入,折半插入,希尔)
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 深入浅出插入类排序算法(直接插入, 折半插入, 希尔排序)
- 深入浅出插入类排序算法(直接插入, 折半插入, 希尔排序)
- 各种排序算法汇总(插入排序:直接插入排序、折半插入排序、希尔排序)
- java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
- three.js内部拖拽例子全详解
- 实现SQL2008 Reporting Service的表单验证
- Eclipse + MinGW + Qt开发环境设置
- 数据结构的优缺点对比
- 实例方法和类方法的区别
- 8.1 内部排序法---插入类排序(直接插入、折半、希尔)
- Qpid
- Android取得程序包名及Activity信息
- 内核开发基础
- Hessian 原理分析
- [iOS]在运行时为类添加方法
- LeetCode 120: Triangle
- 基于FreeRTOS的队列管理的应用
- DML操作记录在UNDO中的信息(undo记录里包含了其对应的数据行的ROWID(并非直接记录,而是拼凑出来的))