基本排序的實現與性能比較java
基本排序通常有:選擇排序,插入排序,冒泡排序。數組
//專門的sort排序類 public class Sort { static boolean less(int a, int b){ return a<b; } static void exch(int array[],int i,int j){ int temp=array[i]; array[i]=array[j]; array[j]=temp; } static void comExch(int array[],int i,int j){ if(less(array[j],array[i])) exch(array,i,j); } static void sort(int array[] ,int l,int r){ example(array,l,r); } static void example(int array[],int l,int r){ for(int i=l+1;i<r;i++){ for(int j=i;j>l;j--){ comExch(array,j-1,j); } } } //選擇排序,每次序最小的 static void selection(int array[],int l,int r){ for(int i=l;i<r;i++){ int min=i; for(int j=i+1;j<r;j++){ if(less(array[j],array[min])){ min=j; } } exch(array,i,min); } } //插入排序 static void insertion(int array[],int l,int r){ int i; for(i=r;i>l;i--) comExch(array, i-1, i); for(i=l+2;i<=r;i++){ int j=i; int v=array[i]; while(less(v,array[j-1])){ array[j]=array[j-1]; j--; } array[j]=v; } } //冒泡排序 static void bubble(int array[],int l,int r){ for(int i=l;i<r;i++){ for(int j=r;j>i;j--){ comExch(array, j-1, j); } } } public static void main(String args[]){ int array[]={1,3,2,5,4,9,8,0}; bubble(array,0,7); for(Integer n:array){ System.out.println(n); } } }
它們之間的性能比較:在最壞狀況和平均狀況三者都是二次方時間複雜度。基本不用額外的存儲控件。但仍是有一個係數的差距。還要比較的是移動次數和比較次數。
less
選擇排序進行了約n*n/2次的比較,和n次交換。
性能
插入排序進行了n*n/4 次比較,n*n/4 次移動。
code
冒泡排序進行n*n/2 次的比較和移動。
對象
根據實驗研究(國外研究的結論):對小文件的排序,插入排序和選擇排序比冒泡排序快2倍。當比較的是String 或者是對象數組時,插入排序比其餘兩個方法快的多。若是交換次數開銷很大的時候:選擇排序是最好的,時間就不是第一位考慮了。
排序