选择排序
算法思想:每一趟从待排序的元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止。
算法图解:
代码实现:
public static void selectSort(int[] arr){
//判断数组是否为空或者数组长度是否只有一个元素
if(arr == null || arr.length < 2){
return;
}
//数组长度
int N = arr.length;
for (int i = 0; i < N; i++) {//控制趟数
int min = i;
for (int j = i+1; j < N; j++) {//得到每一趟的最小元素
min = arr[j] < arr[min] ? j :min;
}
swap(arr,i,min);
}
}
//交换函数swap
public static void swap(int[] arr,int i ,int j){
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
冒泡排序
算法思想:对相邻的元素进行两两比较,如果发生逆序,则进行交换,这样,每趟会将最小(或最大)的元素"浮"到顶端,最终达到完全有序。
算法图解:
代码实现:
public static void bubbleSort(int[] arr){
//判断数组是否为空或者数组长度是否只有一个元素
if(arr == null || arr.length < 2){
return;
}
for (int end = arr.length-1; end >0 ; end--) {//控制趟数
for (int i = 0; i < end; i++) {//相邻两个元素是否发生逆序,如果发生则交换
if(arr[i]>arr[i+1]){
swap(arr,i,i+1);
}
}
}
}
//交换函数swap
public static void swap(int[] arr,int i ,int j){
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}
插入排序
算法思想:将一个元素插入到已经排好的有序表中,从而得到一个新的、元素数量+1的有序表。
算法图解:
代码实现:
public static void insertionSort(int[] arr){
if(arr == null || arr.length < 2){
return;
}
for (int i = 1; i <arr.length ; i++) {//0~i做到有序
for (int j = i-1; j >= 0 && arr[j] > arr[j+1] ; j--) {
swap(arr,j,j+1);
}
}
}
//交换函数swap
public static void swap(int[] arr,int i ,int j){
int tmp = arr[j];
arr[j] = arr[i];
arr[i] = tmp;
}