博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
屌丝的常用排序-----two
阅读量:6070 次
发布时间:2019-06-20

本文共 3021 字,大约阅读时间需要 10 分钟。

由于比较晚了,那我们今天我们说说插入排序。。。

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

我们这里说说八大排序就是内部排序。


1、插入排序---直接插入排序

有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法--,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,为O(n^2)。是稳定的排序方法。插入算法把要排序的分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。

插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

201111231433304812.png

   

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
 
#include <stdio.h>
  
 
#define NUM(a) (
sizeof
(a)/
sizeof
(*a)) 
  
 
int 
insertSort(
int 
*arr, 
const 
int 
n)
 
{
     
//型参条件判断
     
if
(NULL == arr || 0 >= n)
     
{
         
return 
-1;
     
}
      
     
int 
i = 0;    
//用于循环使用
     
int 
j = 0;    
//同上
     
int 
k = -1;    
//用于记录拿出的比较的数据下标
     
int 
tmp = -1;    
//用于记录比较数据
     
for
(i = 1; i < n; i++)
     
{
         
k = i;            
//记录比较的数据的下标
         
tmp = arr[k];    
//记录比较的数据
         
//从小到大排序
         
for
(j = i - 1; (0 <= j)&&(tmp < arr[j]); j--)
         
{
             
//条件满足时数据后移
             
arr[k] = arr[j];
             
k = j;    
         
}
         
arr[k] = tmp;
     
}
     
return 
0;
 
}
  
 
int 
print_array(
const 
int 
*arr, 
const 
int 
n)
 
{
     
//型参条件判断
     
if
(NULL == arr || 0 >= n)
     
{
         
return 
-1;
     
}
      
     
//遍历数组
     
int 
i = 0;
     
for
(i = 0; i < n; i++)
     
{
         
printf
(
"%d "
, *(arr+i));
     
}
     
printf
(
"\n"
);
     
return 
0;
 
}
  
 
int 
main(
void
)
 
{
     
int 
arr[] = { 12, 51, 15, 16, 33, 11, 99, 52, 16, 5, 33, 18};
     
printf
(
"排序之前:"
);
     
print_array(arr, NUM(arr));
     
insertSort(arr, NUM(arr));
     
printf
(
"排序之后:"
);
     
print_array(arr, NUM(arr));
      
     
return 
0;
 
}
  
  
 
/*
 
执行结果:
     
排序之前:12 51 15 16 33 11 99 52 16 5 33 18
     
排序之后:5 11 12 15 16 16 18 33 33 51 52 99
 
*/



2、插入排序希尔排序

     希尔排序(Shell Sort)是插入的一种。是针对直接插入排序的改进。该方法又称缩小排序,因DL.Shell于1959年而得名。

t01b4af3cd6752197ab.png


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
 
#include <stdio.h>
  
 
#define NUM(a) (
sizeof
(a)/
sizeof
(*a)) 
  
 
int 
insertSort(
int 
*arr, 
const 
int 
n)
 
{
     
//型参条件判断
     
if
(NULL == arr || 0 >= n)
     
{
         
return 
-1;
     
}
      
     
int 
i = 0;    
//用于循环使用
     
int 
j = 0;    
//同上
     
int 
k = -1;    
//用于记录拿出的比较的数据下标
     
int 
tmp = -1;    
//用于记录比较数据
     
int 
gap = n;    
//增量大小
     
do
     
{
         
gap = gap / 3 + 1;
         
for
(i = gap; i < n; i+=gap)
         
{
             
k = i;            
//记录比较的数据的下标
             
tmp = arr[k];    
//记录比较的数据
             
//从小到大排序
             
for
(j = i - gap; (0 <= j)&&(tmp < arr[j]); j-=gap)
             
{
                 
//条件满足时数据后移
                 
arr[k] = arr[j];
                 
k = j;    
             
}
             
arr[k] = tmp;
         
}
     
}
while
(1 < gap);
     
return 
0;
 
}
  
 
int 
print_array(
const 
int 
*arr, 
const 
int 
n)
 
{
     
//型参条件判断
     
if
(NULL == arr || 0 >= n)
     
{
         
return 
-1;
     
}
      
     
//遍历数组
     
int 
i = 0;
     
for
(i = 0; i < n; i++)
     
{
         
printf
(
"%d "
, *(arr+i));
     
}
     
printf
(
"\n"
);
     
return 
0;
 
}
  
 
int 
main(
void
)
 
{
     
int 
arr[] = { 12, 51, 15, 16, 33, 4, 8, 19, 31, 11, 99, 52, 16, 5, 33, 18};
     
printf
(
"排序之前:"
);
     
print_array(arr, NUM(arr));
     
insertSort(arr, NUM(arr));
     
printf
(
"排序之后:"
);
     
print_array(arr, NUM(arr));
      
     
return 
0;
 
}
  
  
 
/*
     
运算结果:
     
排序之前:12 51 15 16 33 4 8 19 31 11 99 52 16 5 33 18
     
排序之后:4 5 8 11 12 15 16 16 18 19 31 33 33 51 52 99
 
*/
      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1761125,如需转载请自行联系原作者
你可能感兴趣的文章
一个想法(续二):换个角度思考如何解决IT企业招聘难的问题!
查看>>
tomcat指定配置文件路径方法
查看>>
linux下查看各硬件型号
查看>>
对象合成复用之策略模式
查看>>
linux命令之tail
查看>>
epoll的lt和et模式的实验
查看>>
Flux OOM实例
查看>>
基于智能家居场景的POALRDB性能体验
查看>>
无人餐厅喜忧参半,要成还得看“暖科技”?
查看>>
盒马鲜生To C,美菜网To B:生鲜独角兽的不同成长之路
查看>>
影响网页渲染的关键
查看>>
如何快速更新当前项目到最新的Angular稳定版本
查看>>
19.gdb调试
查看>>
koa源码阅读[0]
查看>>
云栖科技评论 | “虚拟X”占领真实世界
查看>>
Guava 27.1 正式发布,Google 的 Java 核心工具库
查看>>
vi编辑器的使用(2)
查看>>
ReSharper Ultimate 2018.3.4 发布
查看>>
python数据分析之基情的择天记
查看>>
技术 | Python从零开始系列连载(二十七)
查看>>