*動圖與部分算法介紹引用自https://www.cnblogs.com/onepixel/articles/7674659.html
冒泡排序(Bubble Sort)
冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因爲越小的元素會經由交換慢慢“浮”到數列的頂端。
動態演示:
原理:對相鄰兩個元素進行兩兩比較,將兩者間較大(小)的交換位置
代碼演示:
package sort;
/**
* Author:FengWenSheng
* Date:Mar 2, 2019
* Description:Sort02.java
*/
public class Sort02 {
/**
* 冒泡排序
* */
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 原理:對相鄰兩個元素進行兩兩比較,將兩者間較大(小)的交換位置
* 第一層for循環表示需要遍歷的元素個數
* 一般寫爲arr.length
* 但是因爲在最後第二次遍歷時,實際上已經確定了最後兩個的大小,而最後一個已經不需要再進行比較了
* 也可以寫爲arr.length - 1節省最後一次運算
* 第二層for循環遍歷相鄰的兩兩元素之間的大小
* 每一次循環後內循環遍歷次數減一(因爲不需要比較之前比較後排好的元素)
* 因爲在判斷語句中需要與後一位進行相鄰比較
* 因此在此基礎上需要減去1,不需要遍歷全部,也避免了數組下標超出範圍
* arr.length - i - 1
* */
int[] arr = {3,2,5,1,4};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j+1]) {
int idx = arr[j];
arr[j] = arr[j+1];
arr[j+1] = idx;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
第一層for循環表示需要遍歷的元素個數,一般寫爲(arr.length)。但是因爲在最後第二次遍歷時,實際上已經確定了最後兩個的大小,而最後一個已經不需要再進行比較了,所以也可以寫爲(arr.length - 1)節省最後一次運算
第二層for循環遍歷相鄰的兩兩元素之間的大小,每一次循環後內循環遍歷次數減一(因爲不需要比較之前比較後排好的元素),因爲在判斷語句中需要與後一位進行相鄰比較。因此在此基礎上需要減去1,不需要遍歷全部,也避免了數組下標超出範(arr.length - i - 1)
選擇排序(Selection Sort)
選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
動態演示:
原理:將當前元素i與i之後的每個元素進行比較,獲得最小(大)的值
代碼演示:
package sort;
/**
* Author:FengWenSheng
* Date:Mar 1, 2019
* Description:Sort03.java
*/
public class Sort03 {
/**
* 選擇排序
* */
public static void main(String[] args) {
// TODO Auto-generated method stub
/**
* 原理:將當前元素i與數組剩餘元素進行比較,獲得最小(大)的值
* 如第一層循環的第1次循環時,將第1個元素與第2,3...n個元素進行比較,並交換獲得每次比較的最小(大)值
* 這時第一個元素的爲數組中最小(大)的一個,直至所有元素排列完畢
* 而實際上排列至最後第二個時,最後一個元素位置已經可以確定,因此可以將第一層循環的arr.length改寫爲arr.length - 1
* 第一層循環爲遍歷的元素個數
* 第二層循環用於比較數組中最小(大)的一個元素
* 因爲是從第i個元素與i後面的元素進行比較,遍歷時j = i + 1,
* */
int[] arr = {2,4,1,3};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int idx = arr[i];
arr[i] = arr[j];
arr[j] = idx;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
如第一層循環的第1次循環時,將第1個元素與第2,3...n個元素進行比較,並交換獲得每次比較的最小(大)值,這時第一個元素的爲數組中最小(大)的一個,直至所有元素排列完畢。而實際上排列至最後第二個時,最後一個元素位置已經可以確定,因此可以將第一層循環的arr.length改寫爲arr.length - 1。第一層循環爲遍歷的元素個數,第二層循環用於比較數組中最小(大)的一個元素,因爲是從第i個元素與i後面的元素進行比較,遍歷時j = i + 1