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

首頁 > 編程 > Java > 正文

Java編程中快速排序算法的實現及相關算法優化

2019-11-26 14:23:06
字體:
來源:轉載
供稿:網友

時間復雜度

平均情況:O(nlgn)
最壞情況:O(n*n),發生在當數據已經是排序狀態時
快排算法的基本原理

1、從數據中選取一個值a[i]作為參考
2、以a[i] 為參考,將數據分成2部分:P1、P2,P1中的數據全部≤a[i],P2中的數據全部>a[i],數據變為{{P1}{a[i]}{P2}}
3、將P1、P2重復上述步驟,直到各部分中只剩1個數據
4、數據完成升序排列

基本示例:

原始數據:

  {3,9,8,5,2,1,6}

第1步:選取第1個數據:3
第2步:將數據分成2部分,左邊≤3,右邊大于>3:

  {2,1} {3} {9,8,5,6}

第3步:將各部分重復以上步驟,直到每部分只剩1個數據:

  {2,1} => {1} {2}  {9,8,5,6} => {8,5,6} {9}=> {5,6} {8} {9}=> {5} {6} {8} {9}

第4步:數據完成升序排列:

  {1} {2} {3} {5} {6} {8} {9}

程序中數據通常保存在數組中,以int類型的數組為例,可以將上面的步驟寫成一個quickSort函數原型:

quickSort(int begin, int end) { //begin為數組的第一個數據的索引值,end為數組的最后一個數據的索引值+1  //如果只有1個數據或0個數據,則程序返回  if( begin == end || begin == (end-1) ) return;   int p = in[begin];//p為選擇的參考數據,選擇第一個數據  int a = begin +1; //a作為2部分數據分界線的索引值  int b = a;//b為待比較的數據的索引值  for( ; b < end; b++) {//將數組中的各個數據依次與參考數據進行比較    if( in[b] < p) { //如果該數據<參考數據則將其移動到左邊      if(a == b){a++; continue;} //如果該數據已經在左邊則不動      int temp = in[a];//將數據移動到左邊      in[a] = in[b];      in[b] = temp;      a++;//將分界線右移    }  }  in[begin] = in[a-1];//講參考值移動到2組數據中間  in[a-1] = p;  if( a-1 > begin){ // 如果左邊有數據則將其重復上述步驟    quickSort(begin, a);  }   if( end-1 > a ) {// 如果右邊有數據則將其重復上述步驟    quickSort(a, end);  }   return; // 如果無數據返回}

算法優化
上面這個快速排序算法可以說是最基本的快速排序,因為它并沒有考慮任何輸入數據。但是,我們很容易發現這個算法的缺陷:這就是在我們輸入數據基本有序甚至完全有序的時候,這算法退化為冒泡排序,不再是O(n

主站蜘蛛池模板: 广丰县| 德清县| 独山县| 巴林左旗| 黑水县| 如皋市| 中西区| 乌兰浩特市| 讷河市| 黔西县| 黔西| 政和县| 宁津县| 平乐县| 云南省| 黄梅县| 耒阳市| 遂昌县| 大厂| 略阳县| 麻阳| 德兴市| 清水河县| 达州市| 扎兰屯市| 安丘市| 常宁市| 庆云县| 固始县| 英吉沙县| 阿城市| 澄迈县| 凤凰县| 南宁市| 康马县| 梁河县| 中宁县| 卓资县| 垦利县| 枣阳市| 青川县|