<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>

            Java常用的7大排序算法

            時間:2025-10-21 01:25:06 java語言

            Java常用的7大排序算法

              Java是一門面向對象編程語言,以下總結了下java中常用的七大排序算法,希望對大家有幫助!

              1.插入排序算法

              插入排序的基本思想是在遍歷數組的過程中,假設在序號 i 之前的元素即 [0..i-1] 都已經排好序,本趟需要找到 i 對應的元素 x 的正確位置 k ,并且在尋找這個位置 k 的過程中逐個將比較過的元素往后移一位,為元素 x “騰位置”,最后將 k 對應的元素值賦為 x ,一般情況下,插入排序的時間復雜度和空間復雜度分別為 O(n2 ) 和 O(1)。

              /**

              * @param int[] 未排序數組

              * @return int[] 排完序數組

              */

              public int[] sortInsert(int[] array){

              for(int i=1;i<array.length;i++){

              int temp = array[i];

              int j;

              for(j=i-1;j >= 0 && temp< array[j]; j--){

              array[j + 1] = array[j];

              }

              array[j + 1] = temp;

              }

              return array;

              }

              2.選擇排序算法

              選擇排序的基本思想是遍歷數組的過程中,以 i 代表當前需要排序的序號,則需要在剩余的 [i…n-1] 中找出其中的最小值,然后將找到的最小值與 i 指向的值進行交換。因為每一趟確定元素的過程中都會有一個選擇最大值的子流程,所以人們形象地稱之為選擇排序。選擇排序的時間復雜度和空間復雜度分別為 O(n2 ) 和 O(1) 。

              /**

              * @param int[] 未排序數組

              * @return int[] 排完序數組

              */

              public int[] sortSelect(int[] arr){

              for (int i = 0; i < arr.length; i++) {

              int miniPost = i;

              for (int m = i + 1; m < arr.length; m++) {

              if (arr[m] < arr[miniPost]) {

              miniPost = m;

              }

              }

              if (arr[i] > arr[miniPost]) {

              int temp;

              temp = arr[i];

              arr[i] = arr[miniPost];

              arr[miniPost] = temp;

              }

              }

              return arr;

              }

              3.冒泡排序算法

              冒泡排序是將比較大的數字沉在最下面,較小的浮在上面

              /**

              * @param int[] 未排序數組

              * @return int[] 排完序數組

              */

              public int[] sortBubble(int[] array){

              int temp;

              /pic/p>

              for(int i=0;i<array.length-1;i++){

              for (int j = array.length - 1; j > i; j--) {

              if (array[j] < array[j - 1]) {

              temp = array[j];

              array[j] = array[j - 1];

              array[j - 1] = temp;

              }

              }

              }

              return array;

              }

              4.快速排序算法

              通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可以分別對這兩部分記錄繼續進行排序,已達到整個序列有序的目的,本質就是,找一個基位(樞軸,分水嶺,作用是左邊的都比它小,右邊的都比它大。

              可隨機,取名base,首先從序列最右邊開始找比base小的,如果小,換位置,從而base移到剛才右邊(比較時比base小)的位置(記為臨時的high位),這樣base右邊的都比base大。然后,從序列的最左邊開始找比base大的,如果大,換位置,從而base移動到剛才左邊(比較時比base大)的位置(記為臨時的low位),這樣base左邊的都比base小,循環以上兩步,直到 low == heigh, 這使才真正的找到了樞軸,分水嶺. 返回這個位置,分水嶺左邊和右邊的序列,分別再來遞歸。

              /**

              * @param int[] 未排序數組

              * @return int[] 排完序數組

              */

              public int[] sortQuick(int[] array){

              return quickSort(array, 0, array.length-1);

              }

              private int[] quickSort(int[] arr, int low, int heigh) {

              if (low < heigh) {

              int division = partition(arr, low, heigh);

              quickSort(arr, low, division - 1);

              quickSort(arr, division + 1, heigh);

              }

              return arr;

              }

              /pic/p>

              private int partition(int[] arr, int low, int heigh) {

              int base = arr[low]; /pic/p>

              while (low < heigh) { /pic/p>

              while (low < heigh && arr[heigh] >= base) {

              heigh--;

              }

              /pic/p>

              swap(arr, heigh, low);

              while (low < heigh && arr[low] <= base) {

              low++;

              }

              /pic/p>

              swap(arr, heigh, low);

              }

              /pic/p>

              return low;

              }

              private void swap(int[] arr, int a, int b) {

              int temp;

              temp = arr[a];

              arr[a] = arr[b];

              arr[b] = temp;

              }

              5.合并排序算法

              歸并排序采用的是遞歸來實現,屬于“分而治之”,將目標數組從中間一分為二,之后分別對這兩個數組進行排序,排序完畢之后再將排好序的兩個數組“歸并”到一起,歸并排序最重要的也就是這個“歸并”的過程,歸并的過程中需要額外的跟需要歸并的兩個數組長度一致的空間

              /**

              * @param int[] 未排序數組

              * @return int[] 排完序數組

              */

              private int[] sort(int[] nums, int low, int high) {

              int mid = (low + high) / 2;

              if (low < high) {

              /pic/p>

              sort(nums, low, mid);

              /pic/p>

              sort(nums, mid + 1, high);

              /pic/p>

              merge(nums, low, mid, high);

              }

              return nums;

              }

              private void merge(int[] nums, int low, int mid, int high) {

              int[] temp = new int[high - low + 1];

              int i = low;/pic/p>

              int j = mid + 1;/pic/p>

              int k = 0;

              /pic/p>

              while (i <= mid && j <= high) {

              if (nums[i] < nums[j]) {

              temp[k++] = nums[i++];

              } else {

              temp[k++] = nums[j++];

              }

              }

              /pic/p>

              while (i <= mid) {

              temp[k++] = nums[i++];

              }

              /pic/p>

              while (j <= high) {

              temp[k++] = nums[j++];

              }

              /pic/p>

              for (int k2 = 0; k2 < temp.length; k2++) {

              nums[k2 + low] = temp[k2];

              }

              }

              public int[] sortMerge(int[] array) {

              return sort(array, 0, array.length - 1);

              }

              6.希爾排序算法

              希爾排序的誕生是由于插入排序在處理大規模數組的時候會遇到需要移動太多元素的問題。希爾排序的思想是將一個大的數組“分而治之”,劃分為若干個小的數組。

              以 gap 來劃分,比如數組 [1, 2, 3, 4, 5, 6, 7, 8] ,如果以 gap = 2 來劃分,可以分為 [1, 3, 5, 7] 和 [2, 4, 6, 8] 兩個數組(對應的,如 gap = 3 , 則劃分的數組為: [1, 4, 7] 、 [2, 5, 8] 、 [3, 6] )然后分別對劃分出來的數組進行插入排序,待各個子數組排序完畢之后再減小 gap 值重復進行之前的步驟,直至 gap = 1 ,即對整個數組進行插入排序。

              此時的數組已經基本上快排好序了,所以需要移動的元素會很小很小,解決了插入排序在處理大規模數組時較多移動次數的問題,希爾排序是插入排序的改進版,在數據量大的時候對效率的提升幫助很大,數據量小的時候建議直接使用插入排序就好了。

              /**

              * @param int[] 未排序數組

              * @return int[] 排完序數組

              */

              public int[] sortShell(int[] array) {

              /pic/p>

              int step = array.length / 2;

              while (step >= 1) {

              for (int i = step; i < array.length; i++) {

              int temp = array[i];

              int j = 0;

              /pic/p>

              for (j = i - step; j >= 0 && temp < array[j]; j -= step) {

              array[j + step] = array[j];

              }

              array[j + step] = temp;

              }

              step /= 2;

              }

              return array;

              }

              7.堆排序算法

              本質就是先構造一個大頂堆,parent比children大,root節點就是最大的節點 把最大的節點(root)與尾節點(最后一個節點,比較小)位置互換,剩下最后的尾節點,現在最大,其余的,從第一個元素開始到尾節點前一位,構造大頂堆遞歸。

              /**

              * @param int[] 未排序數組

              * @return int[] 排完序數組

              */

              public int[] sortHeap(int[] array) {

              buildHeap(array);/pic/p>

              int n = array.length;

              int i = 0;

              for (i = n - 1; i >= 1; i--) {

              swap(array, 0, i);

              heapify(array, 0, i);

              }

              return array;

              }

              private void buildHeap(int[] array) {

              int n = array.length;/pic/p>

              for (int i = n / 2 - 1; i >= 0; i--)

              heapify(array, i, n);

              }

              private void heapify(int[] A, int idx, int max) {

              int left = 2 * idx + 1;/pic/p>

              int right = 2 * idx + 2;/pic/p>

              int largest = 0;/pic/p>

              if (left < max && A[left] > A[idx])

              largest = left;

              else

              largest = idx;

              if (right < max && A[right] > A[largest])

              largest = right;

              if (largest != idx) {

              swap(A, largest, idx);

              heapify(A, largest, max);

              }

              }

              }

              /pic/p>

              /pic/p>

              public static void heapAdjust(int[] array, int s, int m) {

              /pic/p>

              array[0] = array[s];

              /pic/p>

              for (int j = 2 * s; j <= m; j *= 2) {

              /pic/p>

              if (j < m && array[j] < array[j + 1]) {

              j++;

              }

              if (!(array[0] < array[j])) {

              break;

              }

              /pic/p>

              array[s] = array[j];

              /pic/p>

              s = j;

              }

              /pic/p>

              array[s] = array[0];


            【Java常用的7大排序算法】相關文章:

            常用Java排序算法詳解10-07

            Java排序算法03-05

            JAVA語言的常見排序算法11-24

            java常見的排序算法的代碼10-23

            Java常用的五大排序算法11-01

            java堆排序的算法思想的分析10-07

            JAVA簡單選擇排序算法及實現02-10

            冒泡排序算法原理及JAVA實現代碼方法03-20

            JAVA常用4種排序方法02-09

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院