程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 疾速排序和分治排序引見

疾速排序和分治排序引見

編輯:關於JAVA

疾速排序和分治排序引見。本站提示廣大學習愛好者:(疾速排序和分治排序引見)文章只能為提供參考,不一定能成為您想要的結果。以下是疾速排序和分治排序引見正文


疾速排序讓我看了良久,也熬煎了我很長時光,由於年夜體上的思緒我是有了,然則寫代碼時老是湧現各類成績,要想把它調試出來對我小我來講照樣有必定難度的,並且由於任務和偷懶的緣由,招致之前調試不出來的毛病放了良久,明天終究出來啦,照樣有些小沖動的哦,上面來分享一下我的代碼並做一點點解釋。

  要學會疾速排序,就必需先要學會分治法,分治的思惟是給一串亂序的數字(數字是假定,也能夠是其他的對象,固然辦法的參數可以本身界說哦,我在這裡假定有一個整型的數組吧)然後給他一個中央數,分治法會把這些數字以給他的誰人是中央數為分界分為兩部門,一部門在中央數的右邊,另外一部門在左邊,以這個數為分界點,雙方的數如今照樣亂序的,我給他界說的辦法以下:

//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數做為分界數,這只是為了解釋。

  明確了分治,那末疾速排序也就簡略了,那就是對曾經分為兩部門的數再停止分治,順次類推,直到全體的數字都有序為止,代碼以下:

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的平方),由於假如正好這個數組是有序的,然後我們每次都取傳過去的最左真個數,那末效力就會很低,所以要防止產生這類情形,假如檢測一切的選項,那末將會很花時光,所以一個折衷的方法 ,就是把最左真個數和最右真個數加上一個中央的數,找到他們三個中央的數,以這個為分界值就會變的好一點,在下面辦法的基本上,修正今後的代碼以下,然則我做完了今後如許的做法不是很好,應當把分界值也當作傳給分治的辦法會好些,仔細的同伙可以本身試一下,我在這裡就不試了哈,年夜體上是一樣的哦!

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+" ");
    }
  }
}

代碼運轉以下:

95   40   64   18   78   23   73   84   40   


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

以上就是我進修到的器械,記載一下,以備前面查閱。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved