java 陣列排序
阿新 • • 發佈:2018-11-19
選擇排序
將要排序的一組數字進行遍歷。
第一次遍歷,將第一個位置上的數字與後面的數字進行比較,如果後面的數字比第一個位置上的元素小,則將兩個數字的位置進行交換。
第二次遍歷,將第二個位置上的數字與後面的數字進行比較,如果後面的數字比第二個位置上的元素小,則將兩個數字的位置進行交換。
依次進行遍歷、位置交換,直到這組數字排序完成。
假設要遍歷數字的個數是n,則需要遍歷的次數是n-1
public static void selectSort(int[] arr) { int temp; for (int i = 0; i < arr.length - 1; i++) { for (int j = i + 1; j < arr.length; j++) { //每次arr[i]和剩下的所有arr[j]依次比較 if (arr[i] > arr[j]) { temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; } } } }
氣泡排序:
將要排序的一組數字進行遍歷。
第一次遍歷,將相鄰的兩個數字進行比較,直到這組數字全部比較完成,如果前面比後面的數字大,則進行交換位置,此時可以將最大的數字篩選出來,放到最後的位置上。也可以將最小的數字篩選出來放到最後一個位置上.
第二次遍歷,將相鄰的兩個數字進行比較,直到這組數字全部比較完成,如果前面比後面的數字大,則進行交換位置,將這組數字裡面第二大的數字篩選出來,放到倒數第二的位置上。
依次進行遍歷,交換位置,直到排序完成。
public static void bubbleSort(int[] arr) { int temp; /* * for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - * 1- i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; * arr[j + 1] = temp; } } } */ // 第一次迴圈n-1遍 for (int i = arr.length - 1; i > 0; i--) { for (int j = 0; j < i; j++) { //每次是a[j]和a[j+1]比較,前者小於後者就交換,那麼最小的一路交換到最後面, 下次就不考慮最後面的那個數,比較前面幾個就可以了,以此類推 if (arr[j] < arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } //降序排列,升序的話只需要將if (arr[j] < arr[j + 1])改為if (arr[j] >arr[j + 1])
快速排序:
快速排序基於分治的思想,每次在數列中選取一個基準值,可以選第一個元素
然後定義兩個指標,I,J,
當I<J的時候,J從右向左掃描,找比基準值小的值,I從左向右掃描,找比基準值大的值,找到後交換兩者的順序,
這樣進行,總有I=J的時候,(條件就是先讓J從右向左掃描,再讓I從左到右,才能滿足I不大於J的條件),這時候讓基準值和I位置的變數交換,基準值左邊大數全小於它,基準值右邊的數全大於它,完成第一次任務
再來吧,既然基準值左邊的數都小於它,但還是亂序的,怎麼辦,對左邊的子序列排序,對右邊的子序列排序,遞迴進行,就會排好
程式碼如下,遞迴方式下的快速排序
public class QuickSort {
public static void main(String[] args) {
int[] arr = { 4, 1, 7, 6, 3, 5, 4, 4 };
quickSort(arr);
for (int i : arr) {
System.out.print(i + ",");
}
}
public static void quickSort(int[] arr) {
partition(arr, 0, arr.length - 1);
}
public static void partition(int[] arr, int left, int right) {
if (left > right) {
return;
}
int i = left;
int j = right;
// 定義基準值為陣列第一個數
int temp = arr[left];
while (i < j) {
// 從右往左找比基準值小的數
while (arr[j] >= temp && i < j) {
j--;
}
// 再從左向右找比基準數大的值,因為j先減小,那麼最終交換完成後退出while迴圈時,i只能等於j
while (arr[i] <= temp && i < j) {
i++;
}
// 如果i<j,交換它們位置的元素
if (i < j) {
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
// 交換基準值和(i==j)處的元素,使基準值到一箇中間位置,
// 左邊序列都小於基準值,亂序,右邊序列都大於基準值,亂序
arr[left] = arr[i];
arr[i] = temp;
// 對左邊子序列進行快排
partition(arr, left, i - 1);
// 對右邊子序列進行快排
partition(arr, i + 1, right);
}
}