博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法之简单排序
阅读量:7103 次
发布时间:2019-06-28

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

一。直接插入排序
1。直接插入排序:
直接插入排序是一种简单的排序方法,它的基本思想是将待排序的记录按照其值的大小插入到已排好序的有序表的适当位置,直到全部插入完为止。举个整型的排序例子
2。直接插入排序的伪代码:
None.gif
insertionsort(data[])
None.gif   
for
 i
=
1
 to data.length
-
1
None.gif       tmp
=
data[i];
None.gif       将所有大于tmp的元素data[j]向后移动一位;
None.gif       将tmp放在正确的位置上;
None.gif
3.简单例子,以整型为例。
A)ruby语言实现:
 
None.gif
def insertion_sort(a)
None.gif  i
=
1
None.gif  
while
 i
<
a
.
length
None.gif    tmp
=
a[i]
None.gif    j
=
i
None.gif    
while
 j
>
0
None.gif      break 
if
 tmp
>
a[j
-
1
]
None.gif      a[j]
=
a[j
-
1
]
None.gif      j
-=
1
None.gif    end
None.gif    a[j]
=
tmp
None.gif    i
+=
1
None.gif  end
None.gifend       
None.gifa
=
[
10
,
2
,
3
]
None.gifinsertion_sort(a)
None.gifa
.
each
{
|
|
 
print
 i
.
to_s
+
"
 
"
}
None.gif
B)java语言实现:
None.gif
package
 com.sohu.blog.denns_zane.sort;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public
 
class
 InsertSort
dot.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public
 
static
 
void
 main(String args[])
dot.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
int
 []data
=
dot.gif
{
12
,
2
,
3
,
56
,
90
}
;
InBlock.gif        insertsort(data);
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for
(
int
 i
=
0
;i
<
data.length;i
++
)
dot.gif
{
InBlock.gif            System.out.print(data[i]
+
"
 
"
);
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public
 
static
 
void
 insertsort(
int
 []data)
dot.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for
(
int
 i
=
1
,j;i
<
data.length;i
++
)
dot.gif
{
InBlock.gif            
int
 tmp
=
data[i];
InBlock.gif            
for
(j
=
i;j
>
0
&&
tmp
<
data[j
-
1
];j
--
)
InBlock.gif               data[j]
=
data[j
-
1
];
InBlock.gif            data[j]
=
tmp;   
ExpandedSubBlockEnd.gif        }
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}
None.gif
5。算法复杂度:
最好情况:进行n-1次比较和2(n-1)次移动,尽管他们其实都是多余的,复杂度O(n)
最坏情况:具体计算略,O(n*n)
平均情况:O(n*n),也就是接近最坏情况,在平均情况下,数组大小翻倍,它的排序工作将是原来的4倍。
二。选择排序
1。算法描述:选择算法试图先查找一个放错位置的元素并将它放到最终位置上,以此来局部化数组元素的交换。选择值最小的元素并将它和第一个位置上的元素交换。在第i步中,查找data[i],...,data[n-1]中的最小元素,并将它和data[i]进行交换。重复此过程,直到所有的元素都放入正确的位置为止。
2。伪代码描述:
None.gif
selectionsort(data[])
None.gif     
for
 i
=
0
 to data.length
-
2
None.gif        从data[i],dot.gif,data[n
-
1
]中选取最小的元素
None.gif        将它和data[i]交换
None.gif
 
3。实现,以整型数组为例:
1)ruby语言实现:
None.gif
def selection_sort(a)
None.gif  least
=
0
None.gif  
for
 i in (
0
..
(a
.
length
-
2
))
None.gif    j
=
i
+
1
None.gif    least
=
i
None.gif    
while
 j
<
a
.
length
None.gif      
if
 a[j]
<
a[least]
None.gif        least
=
j
None.gif      end
None.gif      j
+=
1
  
None.gif    end
None.gif    a[least]
,
a[i]
=
a[i]
,
a[least] 
unless
 least
==
#
交换
None.gif
  end
None.gifend
None.gifa
=
[
12
,
4
,
34
,
23
,
45
,
35
]
None.gifselection_sort(a)
None.gifa
.
each
{
|
i
|
 
print
 i
.
to_s
+
"
 
"
}
None.gif
代码很好理解,不做解释。
2)java语言实现:
None.gif
package
 com
.
sohu
.
blog
.
denns_zane
.
sort
;
None.gif
None.gifpublic class SelectionSort{
None.gif    public static 
int
[] selection_sort(
int
 [] data){
None.gif        
int
 i
,
j
,
least
=
0
;
None.gif        
for
(i
=
0
;i
<
data
.
length
-
1
;i
++
){
None.gif        
None.gif          
for
(j
=
i
+
1
,
least
=
i;j
<
data
.
length
;j
++
)
None.gif            
if
 (data[j]
<=
data[least])
None.gif                    least
=
j;
None.gif          
if
 (least
!=
i)
None.gif            swap(data
,
least
,
i);  
//
½»»»data[i]ºÍ×îСԪËØ
None.gif        }    
None.gif        
return
 data;   
None.gif    }
None.gif    public static void swap(
int
[]data
,
int
 least
,
int
 i){
None.gif        
int
 tmp
=
data[least];
None.gif        data[least]
=
data[i];
None.gif        data[i]
=
tmp;
None.gif    }
None.gif    public static void main(String args[]){
None.gif        
int
[] t
=
{
10
,
29
,
12
,
23
,
56
};
None.gif        selection_sort(t);
None.gif        
for
(
int
 i
:
t){
None.gif            
System
.
out
.
print
(i
+
"
 
"
);
None.gif        } 
None.gif    }
None.gif}
None.gif
4.算法效率:
任何情况下,都需要进行n*(n-1)/2次比较,也就是O(n*n)的复杂度
最好情况:数组已经排序,不需要交换任何元素
最坏情况:最大元素在第一个位置而其他元素有序时,需要进行3*(n-1)次交换,即O(n),也是很好的结果
三。冒泡排序
1。算法伪代码描述:
None.gif
bubblesort(data[])
None.gif  
for
 i
=
0
 to data.length
-
2
None.gif     
for
 j
=
data.length
-
1
 downto i
+
1
None.gif         如果顺序错误,就交换j和j
-
1位置上的元素
None.gif
2。实现:
1)ruby语言实现:
None.gif
def bubble_sort(data)
None.gif  
for
 i in (
0
..
(data
.
length
-
2
))
None.gif     j
=
data
.
length
-
1
None.gif     
while
 j
>
i
None.gif        
if
 data[j]
<
data[j
-
1
]
None.gif           data[j]
,
data[j
-
1
]
=
data[j
-
1
]
,
data[j]   
#
交换
None.gif
        end
None.gif        j
-=
1
None.gif     end
None.gif  end
None.gifend
None.gifa
=
[
12
,
3
,
56
,
7
,
89
,
87
]
None.gifbubble_sort(a)
None.gifa
.
each
{
|
i
|
 
print
 i
.
to_s
+
"
 
"
}
None.gif
2)java语言实现:
None.gif
package
 com.sohu.blog.denns_zane.sort;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public
 
class
 BubbleSort
dot.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public
 
static
 
void
 bubble_sort(
int
 [] data)
dot.gif
{
InBlock.gif        
for
(
int
 i
=
0
;i
<
data.length
-
1
;i
++
)
InBlock.gif            
for
(
int
 j
=
data.length
-
1
;j
>
i;j
--
)
InBlock.gif              
if
(data[j]
<
data[j
-
1
])
InBlock.gif                swap(data,j,j
-
1
);
InBlock.gif        
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public
 
static
 
void
 swap(
int
[]data,
int
 least,
int
 i)
dot.gif
{
InBlock.gif        
int
 tmp
=
data[least];
InBlock.gif        data[least]
=
data[i];
InBlock.gif        data[i]
=
tmp;
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    
public
 
static
 
void
 main(String args[])
dot.gif
{
ExpandedSubBlockStart.gifContractedSubBlock.gif        
int
[] t
=
dot.gif
{
10
,
29
,
12
,
23
,
56
}
;
InBlock.gif        bubble_sort(t);
ExpandedSubBlockStart.gifContractedSubBlock.gif        
for
(
int
 i:t)
dot.gif
{
InBlock.gif            System.out.print(i
+
"
 
"
);
ExpandedSubBlockEnd.gif        }
 
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif}
None.gif

3。算法效率:
冒泡排序的比较次数近似是插入排序的两倍,和选择排序相同;移动次数和插入排序相同,是选择排序的n倍。可以说,插入排序比冒泡排序快两倍。

文章转自庄周梦蝶  ,原文发布时间5.17

转载地址:http://iruhl.baihongyu.com/

你可能感兴趣的文章
我的C盘空间满了,该怎么清理?
查看>>
ApplicationContext的事件机制
查看>>
Nginx安装、默认虚拟主机、用户认证、nginx中PHP解析
查看>>
20.5 shell脚本中的逻辑判断
查看>>
go 包依赖静态分析
查看>>
媒体转码截图和工作流场景常见问题【系列一】
查看>>
dubbo入门(1)——dubbo-demo
查看>>
聊聊SpringMVC(2)---SpringMVC之请求过程
查看>>
大型网站运维探讨和心得(转载)
查看>>
内网IP和外网IP的区别【图解】
查看>>
PHP 页面跳转的三种方式
查看>>
SAP Cloud for Customer Sales Order Requested Date的业务含义和实现
查看>>
nginx配置https的部署实践
查看>>
Java 集合 List CopyOnWriteArrayList
查看>>
ganache-cli默认network id是什么?
查看>>
Django简单介绍和用户访问流程和项目示例
查看>>
阿里云 Aliplayer高级功能介绍(三):多字幕
查看>>
Data Lake Analytics账号和权限体系详细介绍
查看>>
Spring 定时任务
查看>>
考虑自定义的序列化模式(75)
查看>>