概念
时间复杂度:一段程序运行所需要的的时间
O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<…<O(2n)<O(n!)
空间复杂度:一顿程序运行所占用的内存空间
算法分析
1、冒泡排序
主体思想:通过与相邻元素的比较和交换来把小的数交换到最前面。这个过程类似于水泡向上升一样,因此而得名。举个栗子,对5,3,8,6,4这个无序序列进行冒泡排序。首先从后向前冒泡,4和6比较,把4交换到前面,序列变成5,3,8,4,6。同理4和8交换,变成5,3,4,8,6和4无需交换。6和8交换,变成3,5,4,6,8。这样一次冒泡就完了,把最小的数3排到最前面了。对剩下的序列依次冒泡就会得到一个有序序列。冒泡排序的时间复杂度为O(n^2)。
public static void main(String[] args) {
//初始化数组
int[] arr = {5,3,8,6,4};
//判断数组的长度
if (arr == null || arr.length == 0) {
System.out.println("数组长度为空");
}
//循环执行
for (int i = 0; i < arr.length-1; i++) {
//从最后一个元素开始进行交换
for (int j = arr.length-1; j > i; j--) {
//如果后面的元素比前面的元素小
if (arr[j] < arr[j-1]) {
//进行交换位置
int temp = arr[j-1]; //将小的数字地址存放到临时点
arr[j-1] = arr[j]; //将大的数字地址赋值给后面的
arr[j] = temp; //将临时点的地址值存放到前面
}
}
}
//循环输出所有的元素
for (int i : arr) {
System.out.println(i);
}
}
显示效果如下
2、选择排序
冒泡排序是通过相邻的比较和交换。而选择排序是通过对整体【对后面的每一个数字进行比较】的选择。举个栗子,对5,3,8,6,4这个无序序列进行简单选择排序,首先要选择5以外的最小数来和5交换,也就是选择3和5交换,一次排序后就变成了3,5,8,6,4.对剩下的序列一次进行选择和交换,最终就会得到一个有序序列。其实选择排序可以看成冒泡排序的优化,因为其目的相同,只是选择排序只有在确定了最小数的前提下才进行交换,大大减少了交换的次数。选择排序的时间复杂度为O(n^2)
public static void main(String[] args) {
//初始化数组
int[] arr = {5,3,8,6,4};
//判断数组的长度
if (arr == null || arr.length == 0) {
System.out.println("数组长度为空");
}
//循环比较 N-1次
for (int i = 0; i < arr.length-1; i++) {
//定义最小值所在的索引下标
int minIndex = i;
//每轮需要比较的次数 N-i
for (int j = i+1; j<arr.length; j++) { //从第一个数到最后一个数字逐一进行比较
//判断当前的的数是否比最小值大
if (arr[j] < arr[minIndex]) {
//记录下标
minIndex = j;
}
}
//将找到的最小值和i位置所在的值进行交换
if (minIndex != i) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
for (int i : arr) {
System.out.println(i);
}
}
显示效果如下: