简单排序-冒泡排序,选择排序,插入排序
简单排序
排序,希望都能掌握一下,同时做好笔记,避免每次都重复从网上查找相关内容。
基本概念
时间复杂度:一种事前统计的计算方式,评判一个算法的优劣程度;
空间复杂度:现在基本不会考虑空间复杂度,因为很多时候都会采取以空间换取时间的方式;
算法稳定性:如果待排序的序列中存在值等的元素,经过排序之后,相等元素之间原有的先后顺序不变,就说明这个排序算法时稳定的。
冒泡排序
冒泡排序是一种最简单的排序方式,其时间复杂度为O(n²),空间复杂度为O(1),算法为稳定的
代码实现:
private void bubbleSort(int[] arr){
if (arr.length <= 1){
return;
}
for (int i = 0; i < arr.length; i++){
for(int j = 0; j < arr.length - i - 1; j ++){
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j +1];
arr[j + 1] = temp;
}
}
}
} 插入排序
思路就是以一段排好序的跟一段未排序,将未排序的部分插入到已排序里面,其时间复杂度为O(n²),空间复杂度为O(1),算法为稳定的
private void insertSort(int[] arr){
if (arr.length <= 1){
return;
}
// 每次以当前位置的数据与前面已排序好的数据进行比较
for (int i = 1; i< arr.length ;i++){
// 当前位置数值
int curr = arr[i];
// 排好序的最大的一个位置
int pre = i - 1;
// 最大位置的比当前位置的大,那么将当前位置设置为最大的值
while (pre >= 0 && curr < arr[pre]){
arr[pre + 1] = arr[pre];
// 再往下比较较大的数值
pre --;
}
// 把对应位置的值设置为当前值
arr[pre + 1] = curr;
}
} 选择排序
已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾,其时间复杂度为O(n²),空间复杂度为O(1),算法为不稳定的
private void insertSort(int[] arr){
if (arr.length <= 1){
return;
}
for (int i = 0; i< arr.length ;i++){
int minIndex = i;
for (int j = i ; j < arr.length; j++){
minIndex = arr[minIndex] > arr[j] ? j : minIndex;
}
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}