冒泡排序/插入排序
Posted Java开挂记录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序/插入排序相关的知识,希望对你有一定的参考价值。
一、冒泡排序
1、通过双重循环,相邻两个数据做对比,通过位置交换使其变得有序
2、时间复杂度:O(n*n);空间复杂度:O(1)
图片分析
解释:
外部循环从0开始i
内部循环从0开始j,完整循环后会将本次最大值放入数组最后,下次循环可忽略相应的尾部数据(length-i-1)
重复1、2步即可完成排序
代码实现
public class BubbleSort {
public void sort(int [] items){
//外部循环
for (int i = 0;i < items.length; i++){
//排序终止标识
boolean flag=false;
//内部循环,每次循环之后相应的末尾数据就是有序的了,下次循环可忽略
for (int j = 0; j<items.length-i-1; j++){
if (items[j]>items[j+1]){
int temp = items[j];
items[j] = items[j+1];
items[j+1] = temp;
flag = true;
}
}
//如果内部循环没有需要交互的数据那么代表数据已经是有序的了
if (!flag){
break;
}
}
}
public static void main(String[] args) {
BubbleSort sort = new BubbleSort();
int [] items={3,2,5,1,8,7,4,6};
// int [] items={9,8,7,6,5,4,3,2,1};
// int [] items={1,2,3,4,5,6,7,8,9};
sort.sort(items);
System.out.println(JSON.toJSONString(items));
}
时间复杂度:最好的情况就是完全有序的情况下为:O(n)
空间复杂度:冒泡数据交换算法只会有一个内存占用:O(1)
二、插入排序
1、外部循环从下标为1的数据开始往后循环(因为要将小的放当前数的前面,所以0没有对比的)
2、内循环从外循环的当前数据依次往前循环对比
3、如果当前值比前一个值小则往前移动
4、时间复杂度:O(n*n);空间复杂度:O(1)
图片分析
解释:
外层循环从1开始
将当前值(1的位置)提出作为基准值对比
内层循环从1往前与基准值对比,如果大于基准值,将对比值往后移动(对标图第二行)
如果小于将基准值放入移动后空出的位置(对标图第三行)
依此循环完毕
代码实现
public class InsertionSort {
public void sort(int [] items){
//外层循环从1开始,0无需往前对比
for (int i = 1 ;i < items.length ; i++){
//将要对比的基准值放入临时字段
int temp = items[i];
//内层循环从外层循环开始值往前循环和基准值对比
int j = i-1;
for (;j>=0;j--){
//往前循环对比,如果比基准值大,则后移动(基准值的位置是空的)
if (items[j]>temp){
items[j+1] = items[j];
}else {
break;
}
}
//将基准值插入到空出的位置
items[j+1] = temp;
}
}
public static void main(String[] args) {
InsertionSort sort=new InsertionSort();
int [] items={6,3,7,2,4,5,1,9,8};
// int [] items={9,8,7,6,5,4,3,2,1};
// int [] items={1,2,3,4,5,6,7,8,9};
sort.sort(items);
System.out.println(JSON.toJSONString(items));
}
}
以上是关于冒泡排序/插入排序的主要内容,如果未能解决你的问题,请参考以下文章
排序算法学习(直接插入排序,希尔排序,选择排序,堆排序,冒泡排序)
[leetcode]排序算法(冒泡排序,选择排序,插入排序,快速排序,计数排序)
直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚