国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

快速排序和分治排序介紹

2019-11-26 15:13:43
字體:
供稿:網(wǎng)友

快速排序讓我看了很久,也折磨了我很長時間,因為大體上的思路我是有了,但是寫代碼時總是出現(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ǔ)上,修改以后的代碼如下,但是我做完了以后這樣的做法不是很好,應該把分界值也當做傳給分治的方法會好些,細心的朋友可以自己試一下,我在這里就不試了哈,大體上是一樣的哦!

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:4the point is:1the point is:3the point is:7the point is:6the point is:918 23 40 40 64 73 78 84 95

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武冈市| 三穗县| 通辽市| 安溪县| 南开区| 阳山县| 关岭| 米脂县| 徐汇区| 光山县| 晋州市| 磐石市| 陆良县| 礼泉县| 盐津县| 梁平县| 嵩明县| 德昌县| 岑溪市| 湘西| 普兰县| 察隅县| 东海县| 荔浦县| 鄂伦春自治旗| 荔浦县| 自治县| 颍上县| 辰溪县| 蒙山县| 渑池县| 柘城县| 盖州市| 桦南县| 七台河市| 祁门县| 新昌县| 射洪县| 城市| 南陵县| 吴川市|