快速排序和分治排序

     快速排序讓我看了好久,也折磨了我很長時間,由於大致上的思路我是有了,可是寫代碼時老是出現各類問題,要想把它調試出來對我我的來講仍是有必定難度的,並且由於工做和偷懶的緣由,致使以前調試不出來的錯誤放了好久,今天終於出來啦,仍是有些小激動的哦,下面來分享一下個人代碼並作一點點說明。算法

  要學會快速排序,就必須先要學會分治法,分治的思想是給一串亂序的數字(數字是假設,也能夠是其餘的對象,固然方法的參數能夠本身定義哦,我在這裏假設有一個整型的數組吧)而後給他一箇中間數,分治法會把這些數字以給他的那個是中間數爲分界分爲兩部分,一部分在中間數的左邊,另外一部分在右邊,以這個數爲分界點,兩邊的數如今仍是亂序的,我給他定義的方法以下:數組

//left是數組的想分治部分的左端點,right是數組分治部分的總端點,如長度爲10的數組,我想對前5個整數進行分治,則傳0,4便可
    public int signalFenZhi(int left,int right){
        if(left<0||left>n-1||right<0||right>n-1){
            return -1;
        }
        int temp = test[left];
        int j=right;
        int i=left;
        
        while(i<j){
            while(test[j]>=test[left]&&i<j){
                j--;
            }
            while(test[i]<=test[left]&&i<j){
                i++;
            }
            
            if(i<j){
                temp = test[i];
                test[i]=test[j];
                test[j]=temp;
            }
        }
        
        if(i==j){
            temp = test[i];
            test[i]=test[left];
            test[left]=temp;
        }
        
        for(int m=0;m<n;m++){
            System.out.print(test[m]+"     ");
        }
        
        return i;
            
    }

固然,也能夠把那個中間數當參數傳進來,如今我只是單純的以數組的傳進來的第left數作爲分界數,這只是爲了說明。dom

  明白了分治,那麼快速排序也就簡單了,那就是對已經分爲兩部分的數再進行分治,依次類推,直到所有的數字都有序爲止,代碼以下:學習

public void quickSort(int left,int right){
        if(right-left<1){
            return ;
        }else{
            int point = this.signalFenZhi(left, right);
            System.out.println(point);
            //if(point!=left&&point!=right){
                quickSort(left,point-1);
                quickSort(point+1,right);
            //}
        }
    }

  快速排序的效率在衆多的排序算法中是很優秀的,時間複雜度爲O(N*log2n),可是若是分治的分界點選的很差的話,時間複雜度將會降到(n的平方),由於若是正好這個數組是有序的,而後咱們每次都取傳過來的最左端的數,那麼效率就會很低,因此要避免發生這種狀況,若是檢測全部的選項,那麼將會很花時間,因此一個折中的辦法 ,就是把最左端的數和最右端的數加上一個中間的數,找到他們三個中間的數,以這個爲分界值就會變的好一點,在上面方法的基礎上,修改之後的代碼以下,可是我作完了之後這樣的作法不是很好,應該把分界值也當作傳給分治的方法會好些,細心的朋友能夠本身試一下,我在這裏就不試了哈,大致上是同樣的哦!ui

package com.jll;

public class FenZhi {
    
    int[] test;
    
    int n=10;
    
    public FenZhi(){
        test = new int[10];
        
        for(int i=0;i<n;i++){
            test[i]=(int)(Math.random()*100)+1;
            System.out.print(test[i]+"     ");
        }
        System.out.println();
    }
    
    public FenZhi(int n){
        if(n>0){
            this.n=n;
            test = new int[n];
            
            for(int i=0;i<n;i++){
                test[i]=(int)(Math.random()*100)+1;
            }
        }
    }
    
    public int signalFenZhiMajorizationFirst(int left,int right){
        if(left<0||left>n-1||right<0||right>n-1||left>=right){
            return -1;
        }
        
        if(right-left>=2){
            int middle = (right+left)/2;
            if(test[left]>test[middle]){
                int temp = test[middle];
                test[middle] = test[left];
                test[left] = temp;
            }
            if(test[left]>test[right]){
                int temp = test[left];
                test[left] = test[right];
                test[right] = temp;
            }
            if(test[middle]>test[right]){
                int temp = test[middle];
                test[middle] = test[right];
                test[right] = temp;
            }
            int temp = test[middle];
            test[middle] = test[left];
            test[left] = temp;
            int j=right-1;
            int i=left+1;
            
            while(i<j){
                while(test[j]>=test[left]&&i<j){
                    j--;
                }
                while(test[i]<=test[left]&&i<j){
                    i++;
                }
                
                if(i<j){
                    temp = test[i];
                    test[i]=test[j];
                    test[j]=temp;
                }
            }
            if(i==j){
                temp = test[i];
                test[i]=test[left];
                test[left]=temp;
            }
            
            /*if(i==j){
                temp = test[middle];
                test[middle]=test[i];
                test[i]=temp;
            }*/
            
            /*for(int m=0;m<n;m++){
                System.out.print(test[m]+"     ");
            }*/
            
            return i;
        }else {
            if(test[right]<test[left]){
                int temp = test[right];
                test[right] = test[left];
                test[left] = temp;
            }
            return right;
        }
    }
    
    public void quickSortMajorizationFirst(int left,int right){
        if(right-left<1){
            return ;
        }else{
            int point = this.signalFenZhiMajorizationFirst(left, right);
            System.out.println("the point is:"+point);
            quickSortMajorizationFirst(left,point-1);
            quickSortMajorizationFirst(point+1,right);
        }
    }
    
    public static void main(String[] args) {
        FenZhi f = new FenZhi();
        System.out.println(f.signalFenZhiMajorizationFirst(0, 9));
        System.out.println();
        f.quickSortMajorizationFirst(0,f.n-1);
        
        //f.quickSort(0,f.test.length-1);
        for(int i:f.test){
            System.out.print(i+" ");
        }
    }
}

代碼運行以下:this

17     95     40     64     18     78     23     73     84     40     
1

the point is:4
the point is:1
the point is:3
the point is:7
the point is:6
the point is:9
17 18 23 40 40 64 73 78 84 95

以上就是我學習到的東西,記錄一下,以備後面查閱spa

相關文章
相關標籤/搜索