冒泡排序
冒泡排序,外循环确定比较的次数。内循环里第一个数和第二个数进行比较,如果第一个数大于第二个数就交换两数的位置(降序交换,升序相反),当第二个数交换完之后和第三个数比较,然后依次类推。第一次排序完之后就会确定第一大的数字,然后执行数组长度减一次之后所有的数字就都排序好了。
package com.kfm.base.sort;
import java.util.Arrays;
public class Bubble {
public static void main(String[] args) {
int[] a = {3, 2, 55, 33, 76, 48, 9, 20, 66};
for (int i = 0; i < a.length - 1; i++) { //外层循环表示比较的次数
for (int j = 0; j < a.length - 1 - i; j++) { //内层循环表示要和多少个数字进行比较
if (a[j + 1] < a[j]) { //用一个数和他的前一个数进行比较
//如果前一个数比当前位置的数大就交换位置
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(a));
}
}
动图如下
插入排序
插入排序就是暂定第一个数顺序已排好,然后用第二个数与之比较,如果第二个数小于第一个数就纪录位置,第一次排序结束,然后第一个数后移,将第二个数赋值刚才标记的位置,以此类推,当为第n个数时,与前n减一个数比较,当到小于第n个数时,n到那个数之间的数都要后移。然后将第n个数赋值给标记的那个位置。
package com.kfm.base.sort;
import java.util.Arrays;
public class Insertion {
public static void main(String[] args) {
int[] arr = {3, 5, 2, 8, 9, 6};
for (int i = 1; i < arr.length; i++) {
int current = arr[i]; //取第i个数
int preIndex = i - 1; //取第i+1个数的下标
while (preIndex >= 0 && arr[preIndex] > current) {
arr[preIndex + 1] = arr[preIndex]; //如果第i个后面的数大于第i个数,第i个数后移
preIndex--;//减减是为了能和前面的数比较
}
arr[preIndex + 1] = current; //将这个用于比较的数赋值给比较完后小于这个数的前面一个数
}
System.out.println(Arrays.toString(arr));
}
}
动图如下
选择排序
外层循环控制比较数字的多少,内层遍历没有和前面的数没有比较过的数字,当找到比当前数还小的数字时,记录下标,找到更小的更新下标,循环结束把当前数和记录下标的数字交换位置。
package com.kfm.base.sort;
import java.util.Arrays;
public class Selection {
public static void main(String[] args) {
int[] a = {3, 2, 55, 33, 76, 48, 9, 20, 66};
for (int i = 0; i < a.length - 1; i++) { //从第一个数开始比较
int min = i;
for (int j = i + 1; j < a.length; j++) { //内层循环遍历i+1到最后一个数
if (a[j] < a[min]) {
min = j; //标记找到的数
}
}
int temp = a[min]; //和找到的数交换位置
a[min] = a[i];
a[i] = temp;
}
System.out.println(Arrays.toString(a));
}
}
动图如下
二分查找
二分查找必须限定排好序的数组,将第一位下标和最后一位下标作为标志量,设定一个middle中间下标量,将要查找的数和数组middle下标的数字相比较。如果数组升序,数组的middle下标数大于要查找的数,说明middle在要找的数左边,然后左边的标志量右移至middle右边一位。数组的middle下标数小于要查找的数,说明middle在要找的书的右边,右边的标志量左移到middle左边一位。
package com.kfm.base.sort;
public class Binarysearch {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 5, 6, 7, 8};
int n = 5; //你要查找的数
int left = 0; //第一个数的下标
int right = a.length - 1; //最后一个数的下标
int index = -1; //定义一个标志量
while (left <= right) {
int middle = (left + right) >> 1; //定义一个中值下标
if (a[middle] == n) {
index = middle; //如果a[middle]等于n,说明找到了
break;
} else if (a[middle] < n) {
left = middle + 1; //当a[middle]<n时,说明middle在要找的数左边,然后左边的标志量右移至middle右边一位
} else
right = middle - 1; //当啊a[middle]>n时,说明middle在要找的书的右边,右边的标志量左移到middle左边一位
}
System.out.println(index);
}
}
动图如下