主頁 > 後端開發 > Java 的八種排序演算法

Java 的八種排序演算法

2020-09-12 11:53:21 後端開發

Java 的八種排序演算法

 

    這個世界,需要遺忘的太多,

 

背景:作業三年,演算法一問三不知,

一、八種排序演算法

直接插入排序、希爾排序、簡單選擇排序、堆排序、冒泡排序、快速排序、歸并排序和基數排序,

二、演算法使用

1 直接插入排序

使用場景:

如把新的資料插入到已排好的資料列中,

實作思想:

a、將第一個數和第二個數排序,然后構成一個有序序列;

b、將第三個數插入進去,構成一個新的有序序列;

c、對第四個數、第五個數……直到最后一個數,重復第二步,

 代碼實作:

 1 /**
 2  * @author tjt
 3  * @time 2020-09-02
 4  * Java 排序演算法
 5  */
 6 public class JavaSortAlgorithm {
 7 
 8 
 9     /**
10      * 直接插入排序:
11      * 首先,設定插入次數,即回圈次數,for(int i=1;i<length;i++),第1個數的那次不用插入,會有元素間的比較排序
12      * 然后,設定插入數和得到已經排好序列的最后一個數的位數:insertNum和j=i-1
13      * 從最后一個數開始向前回圈,如果插入數小于當前數,就將當前數向后移動一位
14      * 將當前數放置到空著的位置,即j+1,
15      *
16      * @param array
17      */
18     private static void justInsertSort(int[] array) {
19         System.out.println("***********直接插入排序*************");
20         int length = array.length;
21         // insertNum 為要插入的數
22         int insertNum;
23         for (int i = 1; i < length; i++) {
24             insertNum = array[i];
25             System.out.println("insertNum: " + insertNum);
26             // 已經排序好的序列元素個數
27             int j = i - 1;
28             System.out.println(Arrays.toString(array));
29             // 序列從后到前回圈,將大于insertNum 的數向后移動一格
30             while (j >= 0 && array[j] > insertNum) {
31                 // 元素移動一格
32                 array[j + 1] = array[j];
33                 // j-- 之后繼續于之前的比較,從后往前
34                 j--;
35             }
36             // 將需要插入的數放在要插入的位置,
37             array[j + 1] = insertNum;
38         }
39     }
40 
41 }
View Code~拍一拍

直接插入排序結果驗證:

2 希爾排序

使用場景:

對于直接插入排序問題,資料量巨大時,可以考慮使用希爾排序,

實作思想:

a、將數的個數設為n,取奇數k=n/2,將下標差值為k 的樹分為一組,構成有序序列;

b、再取k=k/2 ,將下標差值為k 的數分為一組,構成有序序列;

c、重復第二步,直到k=1 執行簡單插入排序,

 代碼實作:

 1     /**
 2      * 希爾排序:
 3      * 首先,確定分的組數,然后對組中元素進行插入排序
 4      * 接下來,將length/2,重復1,2步,直到length=0 為止,
 5      *
 6      * @param array
 7      */
 8     private static void xiErSort(int[] array) {
 9         System.out.println("***********希爾排序*************");
10         int length = array.length;
11         while (length != 0) {
12             length = length / 2;
13             // 分的陣列
14             for (int x = 0; x < length; x++) {
15                 // 組中的元素,從第二個數開始
16                 for (int i = x + length; i < array.length; i += length) {
17                     // j為有序序列最后一位的位數
18                     int j = i - length;
19                     // temp 為要插入的元素
20                     int temp = array[i];
21                     // 從后往前遍歷
22                     for (; j >= 0 && temp < array[j]; j -= length) {
23                         // 向后移動length 位
24                         array[j + length] = array[j];
25                     }
26                     array[j + length] = temp;
27                 }
28             }
29         }
30     }
View Code~拍一拍

希爾排序結果驗證:

3 簡單選擇排序

使用場景:

常用于取序列中最大最小的幾個數,(如果每次比較都交換,那么就是交換排序;如果每次比較完一個回圈再交換,就是簡單選擇排序,)

實作思想:

a、遍歷整個序列,將最小的數放在最前面;

b、遍歷剩下的序列,將最小的數放在最前面;

c、重復第二步,直到只剩下一個數,

 代碼實作:

 1  /**
 2      * 簡單選擇排序:
 3      * 首先確定回圈次數,并且記住當前數字和當前位置,
 4      * 將當前位置后面所有的數與當前數字進行對比,小數賦值給key,并記住小數的位置,
 5      * 比對完成后,將最小的值與第一個數的值交換,
 6      * 重復2、3步,
 7      *
 8      * @param array
 9      */
10     private static void simpleSelectSort(int[] array) {
11         System.out.println("***********簡單選擇排序*************");
12         int length = array.length;
13         // 回圈次數
14         for (int i = 0; i < length; i++) {
15             int key = array[i];
16             int position = i;
17             // 選出最小的值和位置
18             for (int j = i + 1; j < length; j++) {
19                 if (array[j] < key) {
20                     key = array[j];
21                     position = j;
22                 }
23             }
24             // 交換位置
25             array[position] = array[i];
26             array[i] = key;
27         }
28     }
View Code~小輪胎

簡單選擇排序結果驗證:

4 堆排序

使用場景:

堆排序使用場景與簡單排序相似,其是簡單排序的優化,

實作思想:

a、將序列構建成大頂堆;

b、將根節點與最后一個節點交換,然后斷開最后一個節點;

c、重復第一、二步,直到所有節點斷開,

 代碼實作:

 1  /**
 2      * 堆排序:
 3      * 將序列構建成大頂堆;
 4      * 將根節點與最后一個節點交換,然后斷開最后一個節點;
 5      * 重復第一、二步,直到所有節點斷開,
 6      *
 7      * @param array
 8      */
 9     public static void heapSort(int[] array) {
10         System.out.println("***********堆排序*************");
11         System.out.println("開始排序:");
12         int arrayLength = array.length;
13         // 回圈建堆
14         for (int i = 0; i < arrayLength - 1; i++) {
15             // 建堆
16             buildMaxHeap(array, arrayLength - 1 - i);
17             // 交換堆頂和最后一個元素
18             swap(array, 0, arrayLength - 1 - i);
19             System.out.println(Arrays.toString(array));
20         }
21     }
View Code~小輪胎

堆排序結果驗證:

5 冒泡排序

使用場景:

一般比較少使用冒泡排序,徐工說會哥冒泡排序出去面試就有15K,

實作思想:

a、將序列中所有元素兩兩比較,將最大的放在最后面,

b、將剩余序列中所有元素兩兩比較,將最大的放在最后面,

c、重復第二步,直到只剩下一個數

 代碼實作:

 1  /**
 2      * 冒泡排序:
 3      * 設定回圈次數,
 4      * 設定開始比較的位數,和結束的位數,
 5      * 兩兩比較,將最小的放到前面去,
 6      * 重復2、3步,直到回圈次數完畢,
 7      *
 8      * @param array
 9      */
10     private static void bubbleSort(int[] array) {
11         int length = array.length;
12         int temp;
13         for (int i = 0; i < length; i++) {
14             for (int j = 0; j < length - i - 1; j++) {
15                 if (array[j] > array[j + 1]) {
16                     temp = array[j];
17                     array[j] = array[j + 1];
18                     array[j + 1] = temp;
19                 }
20             }
21         }
22     }
View Code~拍一拍

冒泡排序結果驗證:

6 快速排序

使用場景:

對排序時間要求較高的情況下可以考慮使用快排,

實作思想:

a、選擇第一個數為p,小于p的數放在左邊,大于p的數放在右邊;

b、遞回的將p左邊和右邊的數都按照第一步進行,直到不能遞回,

 代碼實作:

 1 /**
 2      * 快速排序:
 3      * 選擇第一個數為p,小于p的數放在左邊,大于p的數放在右邊;
 4      * 遞回的將p左邊和右邊的數都按照第一步進行,直到不能遞回,
 5      *
 6      * @param array
 7      * @param start
 8      * @param end
 9      */
10     private static void quicklySort(int[] array, int start, int end) {
11         System.out.println("***********快速排序*************");
12         if (start < end) {
13             // 選定的基準值(第一個數值作為基準值)
14             int base = array[start];
15             // 記錄臨時中間值
16             int temp;
17             int i = start, j = end;
18             do {
19                 while ((array[i] < base) && (i < end)) {
20                     i++;
21                 }
22                 while ((array[j] > base) && (j > start)) {
23                     j--;
24                 }
25                 if (i <= j) {
26                     temp = array[i];
27                     array[i] = array[j];
28                     array[j] = temp;
29                     i++;
30                     j--;
31                 }
32             } while (i <= j);
33             if (start < j) {
34                 quicklySort(array, start, j);
35             }
36             if (end > i) {
37                 quicklySort(array, i, end);
38             }
39         }
40     }
View Code~拍一拍

快速排序結果驗證:

7 歸并排序

使用場景:

速度僅次于快排,在記憶體少的時候使用、可以進行并行計算的時候使用,

實作思想:

a、選擇相鄰兩個陣列成一個有序序列;

b、選擇相鄰的兩個有序序列組成一個有序序列;

c、重復第二步,直到全部組成一個有序序列,

 代碼實作:

 1  /**
 2      * 歸并排序:
 3      * 選擇相鄰兩個陣列成一個有序序列;
 4      * 選擇相鄰的兩個有序序列組成一個有序序列;
 5      * 重復第二步,直到全部組成一個有序序列,
 6      *
 7      * @param arr
 8      * @param l
 9      * @param r
10      */
11     private static void mergeSort(int[] arr, int l, int r) {
12         System.out.println("***********歸并排序*************");
13         if (l < r) {
14             int q = (l + r) / 2;
15             mergeSort(arr, l, q);
16             mergeSort(arr, q + 1, r);
17             merge(arr, l, q, r);
18         }
19     }
20 
21     /**
22      * @param arr 排序陣列
23      * @param l   陣列最左邊下標
24      * @param q   陣列中間位置下標
25      * @param r   陣列最右位置下標
26      */
27     private static void merge(int[] arr, int l, int q, int r) {
28         /**
29          * 因為每次切割后左邊下標都是(l,q),右邊陣列的下標是(q+1,r)
30          * 所以左邊陣列的元素個數就是q - l + 1
31          * 右邊的陣列元素個數就是r - q
32          */
33         // 切割后左邊陣列的資料長度
34         final int n1 = q - l + 1;
35         // 切割后右邊陣列的資料長度
36         final int n2 = r - q;
37         /**創建兩個新陣列將切割后的陣列分別放進去,長度加1是為了放置無窮大的資料標志位**/
38         // 加一操作是增加無窮大標志位
39         final int[] left = new int[n1 + 1];
40         // 加一操作是增加無窮大標志位
41         final int[] right = new int[n2 + 1];
42         //兩個回圈將資料添加至新陣列中
43         /**左邊的陣列下標是從l到q**/
44         /**遍歷左邊的陣列*/
45         for (int i = 0; i < n1; i++) {
46             left[i] = arr[l + i];
47         }
48         for (int i = 0; i < n2; i++) {
49             right[i] = arr[q + 1 + i];
50         }
51 
52         // 將最大的正整數放在兩個新陣列的最后一位
53         left[n1] = Integer.MAX_VALUE;
54         right[n2] = Integer.MAX_VALUE;
55 
56         int i = 0, j = 0;
57         // 將小的放在前面
58         for (int k = l; k <= r; k++) {
59             if (left[i] <= right[j]) {
60                 arr[k] = left[i];
61                 i = i + 1;
62             } else {
63                 arr[k] = right[j];
64                 j = j + 1;
65             }
66         }
67     }
View Code~拍一拍

歸并排序結果驗證:

8 基數排序

使用場景:

適用于數目量較大、很長的數進行排序,(排序佇列存在負數除外)

實作思想:

a、將所有的數的個位數取出,按照個位數進行排序,構成一個序列;

b、將新構成的所有的數的十位數取出,按照十位數進行排序,構成一個序列,

 代碼實作:

 1  /**
 2      * 基數排序:
 3      * 將所有的數的個位數取出,按照個位數進行排序,構成一個序列;
 4      * 將新構成的所有的數的十位數取出,按照十位數進行排序,構成一個序列,
 5      *
 6      * @param array 排序佇列中存在負數除外
 7      */
 8     private static void baseSort(int[] array) {
 9         System.out.println("***********基數排序*************");
10         // 首先確定排序的趟數;
11         int max = array[0];
12         for (int i = 1; i < array.length; i++) {
13             if (array[i] > max) {
14                 max = array[i];
15             }
16         }
17         int time = 0;
18         // 判斷位數;
19         while (max > 0) {
20             max /= 10;
21             time++;
22         }
23         // 建立10個佇列;
24         List<ArrayList> queue = new ArrayList<ArrayList>();
25         for (int i = 0; i < 10; i++) {
26             ArrayList<Integer> queue1 = new ArrayList<Integer>();
27             queue.add(queue1);
28         }
29         // 進行time次分配和收集;
30         for (int i = 0; i < time; i++) {
31             //分配陣列元素;
32             for (int j = 0; j < array.length; j++) {
33                 // 得到數字的第time+1位數;
34                 int x = array[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
35                 ArrayList<Integer> queue2 = queue.get(x);
36                 queue2.add(array[j]);
37                 queue.set(x, queue2);
38             }
39             // 元素計數器;
40             int count = 0;
41             // 收集佇列元素;
42             for (int k = 0; k < 10; k++) {
43                 while (queue.get(k).size() > 0) {
44                     ArrayList<Integer> queue3 = queue.get(k);
45                     array[count] = queue3.get(0);
46                     queue3.remove(0);
47                     count++;
48                 }
49             }
50         }
51     }
View Code~小輪胎

基數排序結果驗證:

八種排序演算法代碼:

  1 package com.ausclouds.bdbsec.tjt;
  2 
  3 import java.util.ArrayList;
  4 import java.util.Arrays;
  5 import java.util.List;
  6 
  7 /**
  8  * @author tjt
  9  * @time 2020-09-02
 10  * Java 排序演算法
 11  */
 12 public class JavaSortAlgorithm {
 13 
 14 
 15     /**
 16      * 直接插入排序:
 17      * 首先,設定插入次數,即回圈次數,for(int i=1;i<length;i++),第1個數的那次不用插入,會有元素間的比較排序
 18      * 然后,設定插入數和得到已經排好序列的最后一個數的位數:insertNum和j=i-1
 19      * 從最后一個數開始向前回圈,如果插入數小于當前數,就將當前數向后移動一位
 20      * 將當前數放置到空著的位置,即j+1,
 21      *
 22      * @param array
 23      */
 24     private static void justInsertSort(int[] array) {
 25         System.out.println("***********直接插入排序*************");
 26         int length = array.length;
 27         // insertNum 為要插入的數
 28         int insertNum;
 29         for (int i = 1; i < length; i++) {
 30             insertNum = array[i];
 31             System.out.println("insertNum: " + insertNum);
 32             // 已經排序好的序列元素個數
 33             int j = i - 1;
 34             System.out.println(Arrays.toString(array));
 35             // 序列從后到前回圈,將大于insertNum 的數向后移動一格
 36             while (j >= 0 && array[j] > insertNum) {
 37                 // 元素移動一格
 38                 array[j + 1] = array[j];
 39                 // j-- 之后繼續于之前的比較,從后往前
 40                 j--;
 41             }
 42             // 將需要插入的數放在要插入的位置,
 43             array[j + 1] = insertNum;
 44         }
 45     }
 46 
 47     /**
 48      * 希爾排序:
 49      * 首先,確定分的組數,然后對組中元素進行插入排序
 50      * 接下來,將length/2,重復1,2步,直到length=0 為止,
 51      *
 52      * @param array
 53      */
 54     private static void xiErSort(int[] array) {
 55         System.out.println("***********希爾排序*************");
 56         int length = array.length;
 57         while (length != 0) {
 58             length = length / 2;
 59             // 分的陣列
 60             for (int x = 0; x < length; x++) {
 61                 // 組中的元素,從第二個數開始
 62                 for (int i = x + length; i < array.length; i += length) {
 63                     // j為有序序列最后一位的位數
 64                     int j = i - length;
 65                     // temp 為要插入的元素
 66                     int temp = array[i];
 67                     // 從后往前遍歷
 68                     for (; j >= 0 && temp < array[j]; j -= length) {
 69                         // 向后移動length 位
 70                         array[j + length] = array[j];
 71                     }
 72                     array[j + length] = temp;
 73                 }
 74             }
 75         }
 76     }
 77 
 78     /**
 79      * 簡單選擇排序:
 80      * 首先確定回圈次數,并且記住當前數字和當前位置,
 81      * 將當前位置后面所有的數與當前數字進行對比,小數賦值給key,并記住小數的位置,
 82      * 比對完成后,將最小的值與第一個數的值交換,
 83      * 重復2、3步,
 84      *
 85      * @param array
 86      */
 87     private static void simpleSelectSort(int[] array) {
 88         System.out.println("***********簡單選擇排序*************");
 89         int length = array.length;
 90         // 回圈次數
 91         for (int i = 0; i < length; i++) {
 92             int key = array[i];
 93             int position = i;
 94             // 選出最小的值和位置
 95             for (int j = i + 1; j < length; j++) {
 96                 if (array[j] < key) {
 97                     key = array[j];
 98                     position = j;
 99                 }
100             }
101             // 交換位置
102             array[position] = array[i];
103             array[i] = key;
104         }
105     }
106 
107 
108     /**
109      * 堆排序:
110      * 將序列構建成大頂堆;
111      * 將根節點與最后一個節點交換,然后斷開最后一個節點;
112      * 重復第一、二步,直到所有節點斷開,
113      *
114      * @param array
115      */
116     public static void heapSort(int[] array) {
117         System.out.println("***********堆排序*************");
118         System.out.println("開始排序:");
119         int arrayLength = array.length;
120         // 回圈建堆
121         for (int i = 0; i < arrayLength - 1; i++) {
122             // 建堆
123             buildMaxHeap(array, arrayLength - 1 - i);
124             // 交換堆頂和最后一個元素
125             swap(array, 0, arrayLength - 1 - i);
126             System.out.println(Arrays.toString(array));
127         }
128     }
129 
130     /**
131      * 交換堆頂和最后一個元素
132      *
133      * @param data
134      * @param i
135      * @param j
136      */
137     private static void swap(int[] data, int i, int j) {
138         int tmp = data[i];
139         data[i] = data[j];
140         data[j] = tmp;
141     }
142 
143     /**
144      * 建堆:對data陣列從0到lastIndex建大頂堆
145      *
146      * @param data
147      * @param lastIndex
148      */
149     private static void buildMaxHeap(int[] data, int lastIndex) {
150         // 從lastIndex處節點(最后一個節點)的父節點開始
151         for (int i = (lastIndex - 1) / 2; i >= 0; i--) {
152             // k保存正在判斷的節點
153             int k = i;
154             // 如果當前k節點的子節點存在
155             while (k * 2 + 1 <= lastIndex) {
156                 // k節點的左子節點的索引
157                 int biggerIndex = 2 * k + 1;
158                 //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k節點的右子節點存在
159                 if (biggerIndex < lastIndex) {
160                     // 若果右子節點的值較大
161                     if (data[biggerIndex] < data[biggerIndex + 1]) {
162                         // biggerIndex總是記錄較大子節點的索引
163                         biggerIndex++;
164                     }
165                 }
166                 // 如果k節點的值小于其較大的子節點的值
167                 if (data[k] < data[biggerIndex]) {
168                     // 交換他們
169                     swap(data, k, biggerIndex);
170                     // 將biggerIndex賦予k,開始while回圈的下一次回圈,重新保證k節點的值大于其左右子節點的值
171                     k = biggerIndex;
172                 } else {
173                     break;
174                 }
175             }
176         }
177     }
178 
179     /**
180      * 冒泡排序:
181      * 設定回圈次數,
182      * 設定開始比較的位數,和結束的位數,
183      * 兩兩比較,將最小的放到前面去,
184      * 重復2、3步,直到回圈次數完畢,
185      *
186      * @param array
187      */
188     private static void bubbleSort(int[] array) {
189         int length = array.length;
190         int temp;
191         for (int i = 0; i < length; i++) {
192             for (int j = 0; j < length - i - 1; j++) {
193                 if (array[j] > array[j + 1]) {
194                     temp = array[j];
195                     array[j] = array[j + 1];
196                     array[j + 1] = temp;
197                 }
198             }
199         }
200     }
201 
202     /**
203      * 快速排序:
204      * 選擇第一個數為p,小于p的數放在左邊,大于p的數放在右邊;
205      * 遞回的將p左邊和右邊的數都按照第一步進行,直到不能遞回,
206      *
207      * @param array
208      * @param start
209      * @param end
210      */
211     private static void quicklySort(int[] array, int start, int end) {
212         System.out.println("***********快速排序*************");
213         if (start < end) {
214             // 選定的基準值(第一個數值作為基準值)
215             int base = array[start];
216             // 記錄臨時中間值
217             int temp;
218             int i = start, j = end;
219             do {
220                 while ((array[i] < base) && (i < end)) {
221                     i++;
222                 }
223                 while ((array[j] > base) && (j > start)) {
224                     j--;
225                 }
226                 if (i <= j) {
227                     temp = array[i];
228                     array[i] = array[j];
229                     array[j] = temp;
230                     i++;
231                     j--;
232                 }
233             } while (i <= j);
234             if (start < j) {
235                 quicklySort(array, start, j);
236             }
237             if (end > i) {
238                 quicklySort(array, i, end);
239             }
240         }
241     }
242 
243     /**
244      * 歸并排序:
245      * 選擇相鄰兩個陣列成一個有序序列;
246      * 選擇相鄰的兩個有序序列組成一個有序序列;
247      * 重復第二步,直到全部組成一個有序序列,
248      *
249      * @param arr
250      * @param l
251      * @param r
252      */
253     private static void mergeSort(int[] arr, int l, int r) {
254         System.out.println("***********歸并排序*************");
255         if (l < r) {
256             int q = (l + r) / 2;
257             mergeSort(arr, l, q);
258             mergeSort(arr, q + 1, r);
259             merge(arr, l, q, r);
260         }
261     }
262 
263     /**
264      * @param arr 排序陣列
265      * @param l   陣列最左邊下標
266      * @param q   陣列中間位置下標
267      * @param r   陣列最右位置下標
268      */
269     private static void merge(int[] arr, int l, int q, int r) {
270         /**
271          * 因為每次切割后左邊下標都是(l,q),右邊陣列的下標是(q+1,r)
272          * 所以左邊陣列的元素個數就是q - l + 1
273          * 右邊的陣列元素個數就是r - q
274          */
275         // 切割后左邊陣列的資料長度
276         final int n1 = q - l + 1;
277         // 切割后右邊陣列的資料長度
278         final int n2 = r - q;
279         /**創建兩個新陣列將切割后的陣列分別放進去,長度加1是為了放置無窮大的資料標志位**/
280         // 加一操作是增加無窮大標志位
281         final int[] left = new int[n1 + 1];
282         // 加一操作是增加無窮大標志位
283         final int[] right = new int[n2 + 1];
284         //兩個回圈將資料添加至新陣列中
285         /**左邊的陣列下標是從l到q**/
286         /**遍歷左邊的陣列*/
287         for (int i = 0; i < n1; i++) {
288             left[i] = arr[l + i];
289         }
290         for (int i = 0; i < n2; i++) {
291             right[i] = arr[q + 1 + i];
292         }
293 
294         // 將最大的正整數放在兩個新陣列的最后一位
295         left[n1] = Integer.MAX_VALUE;
296         right[n2] = Integer.MAX_VALUE;
297 
298         int i = 0, j = 0;
299         // 將小的放在前面
300         for (int k = l; k <= r; k++) {
301             if (left[i] <= right[j]) {
302                 arr[k] = left[i];
303                 i = i + 1;
304             } else {
305                 arr[k] = right[j];
306                 j = j + 1;
307             }
308         }
309     }
310 
311     /**
312      * 基數排序:
313      * 將所有的數的個位數取出,按照個位數進行排序,構成一個序列;
314      * 將新構成的所有的數的十位數取出,按照十位數進行排序,構成一個序列,
315      *
316      * @param array 排序佇列中存在負數除外
317      */
318     private static void baseSort(int[] array) {
319         System.out.println("***********基數排序*************");
320         // 首先確定排序的趟數;
321         int max = array[0];
322         for (int i = 1; i < array.length; i++) {
323             if (array[i] > max) {
324                 max = array[i];
325             }
326         }
327         int time = 0;
328         // 判斷位數;
329         while (max > 0) {
330             max /= 10;
331             time++;
332         }
333         // 建立10個佇列;
334         List<ArrayList> queue = new ArrayList<ArrayList>();
335         for (int i = 0; i < 10; i++) {
336             ArrayList<Integer> queue1 = new ArrayList<Integer>();
337             queue.add(queue1);
338         }
339         // 進行time次分配和收集;
340         for (int i = 0; i < time; i++) {
341             //分配陣列元素;
342             for (int j = 0; j < array.length; j++) {
343                 // 得到數字的第time+1位數;
344                 int x = array[j] % (int) Math.pow(10, i + 1) / (int) Math.pow(10, i);
345                 ArrayList<Integer> queue2 = queue.get(x);
346                 queue2.add(array[j]);
347                 queue.set(x, queue2);
348             }
349             // 元素計數器;
350             int count = 0;
351             // 收集佇列元素;
352             for (int k = 0; k < 10; k++) {
353                 while (queue.get(k).size() > 0) {
354                     ArrayList<Integer> queue3 = queue.get(k);
355                     array[count] = queue3.get(0);
356                     queue3.remove(0);
357                     count++;
358                 }
359             }
360         }
361     }
362 
363     /**
364      * 測驗排序演算法
365      *
366      * @param args
367      */
368     public static void main(String[] args) {
369         int[] array = new int[]{32, 43, 0, 1314, 23, 4, 12, 5, 520};
370         System.out.println("array's origin sort: " + Arrays.toString(array));
371         //justInsertSort(array);
372         //simpleSelectSort(array);
373         //xiErSort(array);
374         //heapSort(array);
375         //bubbleSort(array);
376         //quicklySort(array, 0, array.length - 1);
377         //mergeSort(array, 0, array.length - 1);
378         baseSort(array);
379         System.out.println("array's sort after use algorithm: " + Arrays.toString(array));
380         int[] array2 = new int[]{32, 43, 0, 1314, 23, -4, 12, 5, 520};
381         baseSort(array2);
382 
383     }
384 
385 
386 }
View Code~主君

 

 

這個世界

      需要遺忘的太多

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/13864.html

標籤:Java

上一篇:GO學習Day1

下一篇:面試題系列第6篇:JVM字串常量池及String的intern方法詳解?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more