1.冒泡排序
1.1算法思想
比较相邻的元素,对每一对相邻元素进行比较,如果第一个比第二个大,就交换他们两个。从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。第二轮针对所有的元素重复以上的步骤,除了最后一个数。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1.2 代码实现
public static void bubbleSort(int[] arr){
// 冒泡排序,主要思想是进行n趟遍历,每次将最大值放在最后或将最小值冒在最前面,即需要两两比较
// 两层for循环,外层是要遍历的趟数,内层是每趟遍历的长度
for(int i = 0; i < arr.length; i++){
for(int j = 0; j < arr.length - 1 - i; j++){
if(arr[j] > arr[j+1]){
swap(arr, j, j+1);
}
}
}
}
2. 插入排序
2.1 算法思想
从第二个数开始,往前面已经排好序的子数组进行插入,两层for循环,外层是第二个数到最后一个数,内层是往前插入时需要移动的数字个数
2.2 代码实现
public static void insertSort(int[] arr){
// 从第二个数开始,往前面已经排好序的插入
/*for(int i = 0; i < arr.length - 1; i++){
for(int j = i + 1; j > 0 && arr[j] < arr[j - 1]; j--){
swap(arr,j,j - 1);
}
}*/
for(int i = 1; i < arr.length; i++){
for(int j = i; j > 0 && arr[j] < arr[j - 1]; j--){
swap(arr,j,j-1);
}
}
}
3.选择排序
3.1 算法思想
进行n趟选择(其实n-1趟就可以了),每一趟都将当前趟(即除掉上一趟已经放在正确位置的数)的最大值或最小值放到最后面或最前面,两层for循环,外层确定趟数,内层确定要比较的次数,第一次需要n-1,最后一次需要1次
3.2 代码实现
public static void selectSort(int[] arr){
// 主要思想是,每次选择出最大或最小的元素
// 两层for循环,外层循环定好要选择对应元素的下标,内层选出对应次序最大或最小值的下标
for(int i = 0; i < arr.length; i++){
int min = i;
for(int j = i + 1; j < arr.length; j++){
/*if(arr[min] > arr[j]){
min = j;
}*/
min = arr[min] > arr[j] ? j : min;
}
swap(arr, i, min);
}
}
4.swap函数实现
上面的swap函数Java里没有为我们提供,我们需要自己实现
public static void swap(int[] arr,int i,int j){
if (i == j) {
return;
}
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
关于实现原理,在百度上看到了一个解释的不错的:a=a^b解释