最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

快速排序和分治排序介紹

 更新時間:2015年04月08日 22:38:27   投稿:mdxy-dxy  
這篇文章主要介紹了快速排序和分治排序,需要的朋友可以參考下

快速排序讓我看了很久,也折磨了我很長時間,因為大體上的思路我是有了,但是寫代碼時總是出現(xiàn)各種問題,要想把它調(diào)試出來對我個人來說還是有一定難度的,而且因為工作和偷懶的原因,導致之前調(diào)試不出來的錯誤放了很久,今天終于出來啦,還是有些小激動的哦,下面來分享一下我的代碼并做一點點說明。

  要學會快速排序,就必須先要學會分治法,分治的思想是給一串亂序的數(shù)字(數(shù)字是假設(shè),也可以是其他的對象,當然方法的參數(shù)可以自己定義哦,我在這里假設(shè)有一個整型的數(shù)組吧)然后給他一個中間數(shù),分治法會把這些數(shù)字以給他的那個是中間數(shù)為分界分為兩部分,一部分在中間數(shù)的左邊,另一部分在右邊,以這個數(shù)為分界點,兩邊的數(shù)現(xiàn)在還是亂序的,我給他定義的方法如下:

//left是數(shù)組的想分治部分的左端點,right是數(shù)組分治部分的總端點,如長度為10的數(shù)組,我想對前5個整數(shù)進行分治,則傳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;
      
  }

當然,也可以把那個中間數(shù)當參數(shù)傳進來,現(xiàn)在我只是單純的以數(shù)組的傳進來的第left數(shù)做為分界數(shù),這只是為了說明。

  明白了分治,那么快速排序也就簡單了,那就是對已經(jīng)分為兩部分的數(shù)再進行分治,依次類推,直到全部的數(shù)字都有序為止,代碼如下:

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);
      //}
    }
  }

快速排序的效率在眾多的排序算法中是很優(yōu)秀的,時間復雜度為O(N*log2n),但是如果分治的分界點選的不好的話,時間復雜度將會降到(n的平方),因為如果正好這個數(shù)組是有序的,然后我們每次都取傳過來的最左端的數(shù),那么效率就會很低,所以要避免發(fā)生這種情況,如果檢測所有的選項,那么將會很花時間,所以一個折中的辦法 ,就是把最左端的數(shù)和最右端的數(shù)加上一個中間的數(shù),找到他們?nèi)齻€中間的數(shù),以這個為分界值就會變的好一點,在上面方法的基礎(chǔ)上,修改以后的代碼如下,但是我做完了以后這樣的做法不是很好,應(yīng)該把分界值也當做傳給分治的方法會好些,細心的朋友可以自己試一下,我在這里就不試了哈,大體上是一樣的哦!

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

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

相關(guān)文章

  • Java使用多線程處理未知任務(wù)數(shù)的方案介紹

    Java使用多線程處理未知任務(wù)數(shù)的方案介紹

    這篇文章主要為大家詳細介紹了Java如何使用多線程實現(xiàn)處理未知任務(wù)數(shù),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-03-03
  • SpringBoot實現(xiàn)賬號登錄錯誤次數(shù)的限制和鎖定功能

    SpringBoot實現(xiàn)賬號登錄錯誤次數(shù)的限制和鎖定功能

    本文介紹了如何使用SpringBoot和Redis實現(xiàn)賬號登錄錯誤次數(shù)限制和鎖定功能,通過自定義注解和AOP切面,結(jié)合配置文件靈活設(shè)置最大嘗試次數(shù)和鎖定時長,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • 使用curator實現(xiàn)zookeeper鎖服務(wù)的示例分享

    使用curator實現(xiàn)zookeeper鎖服務(wù)的示例分享

    這篇文章主要介紹了使用curator實現(xiàn)zookeeper鎖服務(wù)的示例,需要的朋友可以參考下
    2014-02-02
  • java實現(xiàn)Api接口加密通信方式

    java實現(xiàn)Api接口加密通信方式

    這篇文章主要介紹了java實現(xiàn)Api接口加密通信方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • springboot自定義攔截器簡單使用及舉例

    springboot自定義攔截器簡單使用及舉例

    Spring Boot攔截器是AOP的一種實現(xiàn),專門攔截對控制層的請求,主要應(yīng)用于判斷用戶權(quán)限,攔截webSocket請求,下面這篇文章主要給大家介紹了關(guān)于springboot自定義攔截器簡單使用及舉例的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • springboot2.0集成rabbitmq的示例代碼

    springboot2.0集成rabbitmq的示例代碼

    這篇文章主要介紹了springboot2.0集成rabbitmq的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • MyBatis-Plus中如何實現(xiàn)動態(tài)表名

    MyBatis-Plus中如何實現(xiàn)動態(tài)表名

    這篇文章主要介紹了MyBatis-Plus中如何實現(xiàn)動態(tài)表名問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Layui 后臺加載菜單欄名稱以及url的例子

    Layui 后臺加載菜單欄名稱以及url的例子

    今天小編就為大家分享一篇Layui 后臺加載菜單欄名稱以及url的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • Spring之詳解bean的實例化

    Spring之詳解bean的實例化

    這篇文章主要介紹了Spring之詳解bean的實例化,文章內(nèi)容詳細,簡單易懂,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2023-01-01
  • Java加載資源文件時的路徑問題的解決辦法

    Java加載資源文件時的路徑問題的解決辦法

    今天偶然看到一篇關(guān)于tomcat加載servlet的文章,不由得想起了java加載資源文件的路徑問題,資源文件可以使xml,properties,圖片等,可以是任何文件
    2013-04-04

最新評論

营山县| 隆子县| 巴青县| 贡觉县| 兖州市| 石台县| 高邑县| 获嘉县| 巨鹿县| 临沂市| 延长县| 科尔| 金寨县| 庄浪县| 阜阳市| 马鞍山市| 祁阳县| 红安县| 商洛市| 桦南县| 莲花县| 嵊泗县| 黄山市| 海原县| 兰州市| 宁乡县| 朝阳市| 江达县| 巢湖市| 和静县| 泗阳县| 吉木乃县| 江城| 磐安县| 常德市| 米林县| 赤壁市| 潜江市| 那坡县| 沙坪坝区| 手游|