常见的排序算法之:冒泡排序和选择排序
1.冒泡排序
1.1原理
在无序区间,通过相邻数的比较,将最大的数冒泡到无序区间的最后,持续这个过程,直到数组整体有序 。
1.2实现
public static void bubbleSort(int[] array) {
//i代表需要比较的趟数
for(int i = 0; i < array.length - 1; i++ ){
//j代表每趟需要比较的次数
for(int j = 0; j < array.length - 1 - i; j++){
if(array[j] > array[j + 1]){
swap(array,j,j + 1);
}
}
}
}
1.3性能分析
时间复杂度:o(n^2)
稳定性:稳定
空间复杂度:O(1)
1.4改进
public static void bubbleSort(int[] array) {
int len = array.length;
while(len > 0){
//falg表示是否已经排好序
boolean flag = true;
for(int i = 0; i < len - 1; i++ ){
if(array[i] > array[i + 1]){
swap(array,i,i + 1);
flag = false;
}
}
//这轮没有发生交换
if(flag){
break;
}
len--;
}
}
2.选择排序
2.1原理
每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元
素排完 。
2.2实现
public static void selectSort(int []array){
int end = array.length - 1;
while (end >= 0){
int max = end;
for(int i = end - 1; i >= 0; i--){
if(array[i] > array[max]){
max = i;
}
}
swap(array,max,end);
end--;
}
}
2.3性能分析
时间复杂度:o(n^2)
稳定性:不稳定
空间复杂度:O(1)
2.4改进
public static void selectSort1(int[] array) {
int begin = 0;
int end = array.length-1;
while(begin < end){
int min = begin;
int max = end;
for(int i = begin; i <= end; i++){
if(array[i] < array[min]){
min = i;
}
if (array[i] > array[max]){
max = i;
}
}
swap(array,begin,min);
//最大的数恰好在开始位置 交换后最大数的下标变为之前的min
if(max == begin){
max = min;
}
swap(array,end,max);
begin++;
end--;
}
}