排序演算法筆記
阿新 • • 發佈:2018-12-17
簡單排序
直接選擇排序
示例資料:25 , 89 , 72 , 15 , 32 , 10 , 8 , 64 先中找到最小數(或最大數),即8將與資料第一位交換形成一個新的順序資料 8,89,72,15,32,10,25,64,這時資料8已經是排好的資料了,不在下一趟選擇最小資料的範圍內,下一趟從89,72,15,32,10,25,64中選擇最小資料,如此迴圈,順序變換如下:
[ 25 , 89 , 72 , 15 , 32 , 10 , 8 , 64 ]
8 , [ 89 , 72 , 15 , 32 , 10 , 25 , 64 ]
8 , 10 , [ 72 , 15 , 32 , 89 , 25 , 64 ]
8 , 10 , 15 , [ 72 , 32 , 89 , 25 , 64 ]
8 , 10 , 15 , 25 , [ 32 , 89 , 72 , 64 ]
8 , 10 , 15 , 25 , 32 , [ 89 , 72 , 64 ]
8 , 10 , 15 , 25 , 32 , 64 , [ 72 , 89 ]
8 , 10 , 15 , 25 , 32 , 64 , 72 , [ 89 ]
程式碼示例:
/**
* 簡單選擇排序
*
* @param arr
*/
public static void selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int min = i;//每一趟迴圈比較時,min用於存放較小元素的陣列下標,這樣當前批次比較完畢最終存放的就是此趟內最小的元素的下標,避免每次遇到較小元素都要進行交換。
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
//進行交換,如果min發生變化,則進行交換
if (min != i) {
swap(arr,min,i);
}
}
}
public void swap(int arr[],int min,int i){
int tmp = arr[min];
arr[min] = arr[i];
arr[i] = tmp;
}
氣泡排序
氣泡排序的基本思想是,對相鄰的元素進行兩兩比較,順序相反則進行交換,這樣,每一趟會將最小或最大的元素“浮”到頂端,最終達到完全有序 程式碼示例:
/**
* 氣泡排序
*
* @param arr
*/
public static void bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
boolean flag = true;//設定一個標記,若為true,則表示此次迴圈沒有進行交換,也就是待排序列已經有序,排序已然完成。
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr,j,j+1);
flag = false;
}
}
if (flag) {
break;
}
}
}
直接插入排序
直接插入排序基本思想是每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。
程式碼示例:
/**
* 插入排序
*
* @param arr
*/
public static void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int j = i;
while (j > 0 && arr[j] < arr[j - 1]) {
swap(arr,j,j-1);
j--;
}
}
}