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

首頁 > 編程 > Java > 正文

快速排序的原理及java代碼實現

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

概述

快速排序是由東尼?霍爾所發展的一種排序算法。在平均狀況下,排序 n 個項目要Ο(nlogn)次比較。事實上,快速排序通常明顯比其他Ο(nlogn) 算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來,并且在大部分真實世界的數據,可以決定設計的選擇,減少所需時間的二次方項之可能性。

快速排序,通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,然后分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。

形象圖示:

步驟

選擇一個基準元素,通常選擇第一個元素或者最后一個元素
通過一趟排序將待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值小。另一部分記錄的元素值均比基準值大
此時基準元素在其排好序后的正確位置
然后分別對這兩部分記錄用同樣的方法繼續進行排序,直到整個序列有序。

實例

原始數據:

3 5 2 6 2
選擇 3 作為基準

第一輪

從右往左找比3小的,2符合,將2和3對調2 5 2 6 3對調一次,查找的方向反向,從左向右找比3大的,5符合,對調2 3 2 6 5再從右往左找比3小的,2符合,對調2 2 3 6 5一輪結束

第二輪

對 [2 2] 采用同上的方式進行,得到2 2 3 6 5

第三輪

對 [6 5] 采用同上的方式進行,得到2 2 3 5 6

最終結果

2 2 3 5 6

代碼實現(Java)

package com.coder4j.main.arithmetic.sorting;public class Quick { private static int mark = 0; /**  * 輔助交換方法  *   * @param array  * @param a  * @param b  */ private static void swap(int[] array, int a, int b) {  if (a != b) {   int temp = array[a];   array[a] = array[b];   array[b] = temp;   // 找到符合的,對調   System.out.println("對調" + array[a] + "與" + array[b] + ",得到");   for (int i : array) {    System.out.print(i + " ");   }   System.out.println();  } } /**  * 新一輪分隔  *   * @param array  * @param low  * @param high  * @return  */ private static int partition(int array[], int low, int high) {  int base = array[low];  mark++;  System.out.println("正在進行第" + mark + "輪分隔,區域:" + low + "-" + high);  while (low < high) {   while (low < high && array[high] >= base) {    high--;    System.out.println("從右往左找比" + base + "小的,指針變動:" + low + "-" + high);   }   swap(array, low, high);   while (low < high && array[low] <= base) {    low++;    System.out.println("從左往右找比" + base + "大的,指針變動:" + low + "-" + high);   }   swap(array, low, high);  }  return low; } /**  * 對數組進行快速排序,遞歸調用  *   * @param array  * @param low  * @param heigh  * @return  */ private static int[] quickSort(int[] array, int low, int heigh) {  if (low < heigh) {   int division = partition(array, low, heigh);   quickSort(array, low, division - 1);   quickSort(array, division + 1, heigh);  }  return array; } /**  * 快排序  *   * @param array  * @return  */ public static int[] sort(int[] array) {  return quickSort(array, 0, array.length - 1); } public static void main(String[] args) {  int[] array = { 3, 5, 2, 6, 2 };  int[] sorted = sort(array);  System.out.println("最終結果");  for (int i : sorted) {   System.out.print(i + " ");  } }}

測試輸出結果:

全選復制放進筆記正在進行第1輪分隔,區域:0-4對調2與3,得到2 5 2 6 3 從左往右找比3大的,指針變動:1-4對調3與5,得到2 3 2 6 5 從右往左找比3小的,指針變動:1-3從右往左找比3小的,指針變動:1-2對調2與3,得到2 2 3 6 5 從左往右找比3大的,指針變動:2-2正在進行第2輪分隔,區域:0-1從右往左找比2小的,指針變動:0-0正在進行第3輪分隔,區域:3-4對調5與6,得到2 2 3 5 6 從左往右找比6大的,指針變動:4-4最終結果2 2 3 5 6 

經測試,與實例中結果一致。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇坪县| 镇康县| 扎囊县| 西峡县| 曲周县| 商城县| 甘洛县| 来安县| 乌兰察布市| 星子县| 静海县| 谢通门县| 鄂托克旗| 西乡县| 方山县| 惠安县| 田东县| 八宿县| 灌云县| 泸水县| 贡觉县| 洞口县| 大冶市| 石城县| 湘潭县| 同江市| 崇信县| 城口县| 苍南县| 望城县| 昌邑市| 土默特左旗| 司法| 时尚| 许昌县| 大渡口区| 隆化县| 如皋市| 鹤庆县| 兰州市| 文成县|