閱讀692 返回首頁    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  數據結構之棧與隊列