阅读692 返回首页    go 阿里云 go 技术社区[云栖]


算法之简单排序

一。直接插入排序
1。直接插入排序:直接插入排序是一种简单的排序方法,它的基本思想是将待排序的记录按照其值的大小插入到已排好序的有序表的适当位置,直到全部插入完为止。举个整型的排序例子
2。直接插入排序的伪代码:
None.gifinsertionsort(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.gifdef 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.gifpackage com.sohu.blog.denns_zane.sort;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public class InsertSortdot.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.gifselectionsort(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.gifdef 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.gifpackage 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.gifbubblesort(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.gifdef 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.gifpackage com.sohu.blog.denns_zane.sort;
None.gif
ExpandedBlockStart.gifContractedBlock.gif
public class BubbleSortdot.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

最后更新:2017-05-17 11:36:53

  上一篇:go  数据结构之递归
  下一篇:go  数据结构之栈与队列