一、冒泡排序
1.设计思路:
重复走过要排序的数列,一次比较相邻的两个元素,如果第一个比第二个大,就交换它们。这一工作重复地进行直到没有元素在需要交换,该数列排序完成。
2.效率分析:
时间复杂度:O(n^2)
空间复杂度:O(n^2)
3.代码实现:
private static <T> void swap(T arr[], int i, int j) {
T temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
public static <T extends Comparable<T>> void bubbleSort(T[] arr) {
if (arr == null || arr.length == 0 || arr.length == 1) {
return;
}
for (int i = 0; i < arr.length; i++) {
boolean flag = false;
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j].compareTo(arr[j + 1]) > 0) {
flag = true;
swap(arr, j, j + 1);
}
}
}
}
二、选择排序
1.设计思路:
在待排序序列中找最小值,最小值和待排序序列头部元素进行交换。
2.效率分析:
时间复杂度:O(n^2)
空间复杂度:O(1)
3.代码实现:
public static <T extends Comparable<T>> void selectSort(T[] arr) {
if (arr == null || arr.length == 0 || arr.length == 1) {//安全检测
return;
}
for (int i = 0; i < arr.length; i++) {//控制待排序序列中起始位置
int minIndex = i;//最小值所在的下标
for (int j = i; j < arr.length; j++) {//从头到尾挑选最小值
if (arr[minIndex].compareTo(arr[j]) > 0) {
minIndex = j;
}
}
//最小值和i下标所在的值进行交换
swap(arr, minIndex, i);
}
}
三、插入排序
1.设计思路:
数列中第一个元素为已排序序列,第二个元素往后为待排序序列,将待排序序列中的元素向已排序序列中依次在合适的位置插入。
特点:越有序越快。
2.效率分析
时间复杂度:O(n^2)
空间复杂度:O(1)
最优时间复杂度:1 2 3 4
3.代码实现:
public static <T extends Comparable<T>> void insertSort(T[] arr) {
if (arr == null || arr.length == 0 || arr.length == 1) {
return;
}
for (int i = 1;i<arr.length;i++){
T value = arr[i];
//将i所在下标元素插入到已排序序列合适位置
for(int j = i-1;j>=0;j--){//j用来移动元素
if(arr[j].compareTo(value)>0) {
arr[j + 1] = arr[j];
}else{
break;
}
//当前待排序元素放置合适位置
arr[j+1] = value;
}
}
}