常见的排序算法有三种最简单(时间复杂度都为)的,分别是选择排序、冒泡排序和插入排序,在此做个小小总结。
选择排序
选择排序的执行步骤为:
- 遍历待排序的序列,找到最小(大)的元素,和序列起始元素交换位置;
- 遍历剩下的待排序序列,找到最小(大)的元素,和待排序序列的起始元素交换位置;
- 重复第2步,直至所有元素排列完成。
代码实现如下:
package com.test;
public class SelectionSort {
public static void selectionSort(int[] arr){
if(arr == null || arr.length < 2){
return;
}
for(int i = 0; i < arr.length - 1; i++){
int minIndex = i;
for(int j = i + 1; j < arr.length; j++){
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
swap(arr, i, minIndex);
}
}
// 从大到小排序
// public static void selectionSort(int[] arr){
// if(arr == null || arr.length < 2){
// return;
// }
// for(int i = 0; i < arr.length - 1; i++){
// int maxIndex = i;
// for(int j = i + 1; j < arr.length; j++){
// maxIndex = arr[j] > arr[maxIndex] ? j : maxIndex;
// }
// swap(arr, i, maxIndex);
// }
// }
// 以下写法要保证i和j不是一个位置的话
public static void swap(int[] arr, int i, int j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
public static void printArray(int[] arr){
System.out.print("数组元素为:");
for(int num: arr){
System.out.print(num + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {2, 3, 8, 1, 3, 4, -1};
printArray(arr);
selectionSort(arr);
printArray(arr);
}
}
冒泡排序
冒泡排序的执行步骤为:
- 从头开始比较相邻的两个元素,如果前者比后者大(小),则交换二者位置,反之继续往右比较相邻的两个元素,一次遍历下来最右侧的元素则为待排序序列中最大(小)的元素,且不再参与下一轮遍历;
- 重复第1步直至所有元素排列完成。
代码实现如下:
public class BubbleSort {
public static void bubbleSort(int[] arr){
if(arr == null || arr.length < 2){
return;
}
for(int i = arr.length - 1; i > 0; i--){
for(int j = 0; j < i; j++){
if(arr[j] > arr[j+1]){
swap(arr, j, j+1);
}
}
}
}
// 从大到小排序
// public static void bubbleSort(int[] arr){
// if(arr == null || arr.length < 2){
// return;
// }
// for(int i = arr.length - 1; i > 0; i--){
// for(int j = 0; j < i; j++){
// if(arr[j] < arr[j+1]){
// swap(arr, j, j+1);
// }
// }
// }
// }
// 以下写法要保证i和j不是一个位置的话
public static void swap(int[] arr, int i, int j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
public static void printArray(int[] arr){
System.out.print("数组元素为:");
for(int num: arr){
System.out.print(num + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {2, 3, 8, 1, 3, 4, -1};
printArray(arr);
bubbleSort(arr);
printArray(arr);
}
}
插入排序
插入排序的执行步骤为:
- 首先对待排序序列的前两个元素进行比较,如果前者比后者大(小),则交换二者位置,反之继续往下执行;
- 接着将第3个元素与前两个排序好的元素进行比较,按照从小(大)到大(小)的顺序将其移入对应的位置;
- 重复第2步直至所有元素排列完成。
public class InsertionSort {
public static void insertionSort(int[] arr){
if(arr == null || arr.length < 2){
return;
}
for(int i = 1; i < arr.length; i++){
for(int j = i - 1; j >= 0 && arr[j] > arr[j+1]; j--){
swap(arr, j, j+1);
}
}
}
// 从大到小排序
// public static void insertionSort(int[] arr){
// if(arr == null || arr.length < 2){
// return;
// }
// for(int i = 1; i < arr.length; i++){
// for(int j = i - 1; j >= 0 && arr[j] < arr[j+1]; j--){
// swap(arr, j, j+1);
// }
// }
// }
// 以下写法要保证i和j不是一个位置的话
public static void swap(int[] arr, int i, int j){
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
public static void printArray(int[] arr){
System.out.print("数组元素为:");
for(int num: arr){
System.out.print(num + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {2, 3, 8, 1, 3, 4, -1};
printArray(arr);
insertionSort(arr);
printArray(arr);
}
}